テキストファイルがあります。
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
「列から行を自動的に計算」を意味します。