web-dev-qa-db-ja.com

Awkコマンドラインを使用してカンマで区切られた列を印刷する

ここに問題があります。 awkを使用してテキストファイルの列を印刷する必要があります。ただし、列はスペースで区切られておらず、単一のコンマのみを使用しています。次のようになります。

column1,column2,column3,column4,column5,column6

Awkを使用して3列目を印刷するにはどうすればよいですか?

52
user3364728

試してください:

awk -F',' '{print $3}' myfile.txt

ここで、-Fでは、フィールド区切り文字として「、」を使用するawkに言っています。

87
SMA

唯一の要件が、各行の3番目のフィールドを印刷することであり、各フィールドがコンマで区切られている場合は、cutを使用できます。

cut -d, -f3 file
  • -d,は、区切り文字をコンマに設定します
  • -f3は、3番目のフィールドのみが印刷されることを指定します
32
Tom Fenech

これを試してくださいawk

awk -F, '{$0=$3}1' file
column3
  • ,フィールドを,で分割する
  • $0=$3行をフィールドのみに設定3
  • 1すべて印刷します。 ( ここで説明

これも使用できます:

awk -F, '{print $3}' file
19
Jotne

bashawk -lessソリューションですが、シンプルですが

while IFS=, read -r a a a b; do echo "$a"; done <inputfile

小さなファイル(<100行)では awk より少ないリソースを使用するため、高速に動作します(高価なforkおよびexecveシステムコールの呼び出しを回避します)。

エド・モートンの編集(答えをハイジャックして申し訳ありませんが、これに対処するより良い方法があるかどうかわかりません):

シェルが小さなファイルに対してawkよりも速く実行されるという神話を休めるために:

$ wc -l file
99 file

$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

$ time awk -F, '{print $3}' file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

本当に十分に小さいファイルを取得すると、シェルスクリプトがawkスクリプトよりも一瞬で実行されますが、誰が気にしますか?

また、awkスクリプトよりも堅牢なシェルスクリプトを記述することが難しいと思われる場合は、投稿したシェルスクリプトの次のバグを参照してください。

$ cat file
a,b,-e,d
$ cut -d, -f3 file
-e
$ awk -F, '{print $3}' file
-e
$ while IFS=, read -r a a a b; do echo "$a"; done <file

$
2
TrueY