各フィールドは1行を占めます。

各フィールドは1行を占めます。

テキストファイルがあります。

a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj

どのように処理し、次の2列ファイルを取得できますか?

a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

または、次の3列ファイル:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jj

私はawkソリューションを好みますが、他のソリューションも大歓迎です。

答え1

各フィールドを行と列の後に配置します。

各フィールドは1行を占めます。

ティー

tr -s ' ' '\n' < infile

grep

grep -o '[[:alnum:]]*' infile

sed

sed 's/\s\+/\n/g' infile

または、より携帯性に優れています。

sed 's/\s\+/\
/g' infile

アッ

awk '$1=$1' OFS='\n' infile

または

awk -v OFS='\n' '$1=$1' infile

柱状

生地

2列の場合:

... | paste - -

3列の場合:

... | paste - - -

など。

sed

2列の場合:

... | sed 'N; s/\n/\t/g'

3列の場合:

... | sed 'N; N; s/\n/\t/g'

など。

パラメータ

... | xargs -n number-of-desired-columns

xargs印刷に使用される場合は、/bin/echoオプションのように見えるデータがオプションとして解釈されるechoことに注意してください。

アッ

... | awk '{ printf "%s", $0 (NR%n==0?ORS:OFS) }' n=number-of-desired-columns OFS='\t'

交渉

... | pr -at -number-of-desired-columns

または

... | pr -at -s$'\t' -number-of-desired-columns

列(autogenパッケージから)

... | columns -c number-of-desired-columns

一般的な出力:

a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

答え2

$ sed -E 's/\s+/\n/g' ip.txt | paste - -
a   aa
aaa b
bb  bbb
c   cc
ccc d
dd  ddd
e   ee
eee f
ff  fff
g   gg
ggg h
hh  hhh
i   ii
iii j
jj  jjj

$ sed -E 's/\s+/\n/g' ip.txt | paste - - -
a   aa  aaa
b   bb  bbb
c   cc  ccc
d   dd  ddd
e   ee  eee
f   ff  fff
g   gg  ggg
h   hh  hhh
i   ii  iii
j   jj  jjj

答え3

ワイルドカードが示すように、これはファイルが正しい形式の場合にのみ機能します。なぜなら、シェルは特殊文字をワイルドカードとして解釈するのではなく、基本的な単語分離規則に満足しているからです。あなたのファイルがこのテストを「通過」する疑いがある場合は、この方法を使用しないでください。

1 つの可能性は、次を使用してprintfこれを行うことです。

printf '%s\t%s\n' $(cat your_file)

これにより、 の内容がトークン化され、ペアにyour_fileなってタブで印刷されます。追加の列を取得するには、%sより多くの書式文字列を使用できますprintf

答え4

BSD rs(再構築)ユーティリティ:

$ rs 0 2
a   aa  aaa     b   bb  bbb     c   cc  ccc
d   dd  ddd     e   ee  eee     f   ff  fff
g   gg  ggg     h   hh  hhh     i   ii  iii
j   jj  jjj
[Ctrl-D][Enter]
a    aa
aaa  b
bb   bbb
c    cc
ccc  d
dd   ddd
e    ee
eee  f
ff   fff
g    gg
ggg  h
hh   hhh
i    ii
iii  j
jj   jjj

0 2はいいいねそしてリスト。指定とは、0「列から行を自動的に計算」を意味します。

関連情報