ここに問題があります。 awkを使用してテキストファイルの列を印刷する必要があります。ただし、列はスペースで区切られておらず、単一のコンマのみを使用しています。次のようになります。
column1,column2,column3,column4,column5,column6
Awkを使用して3列目を印刷するにはどうすればよいですか?
試してください:
awk -F',' '{print $3}' myfile.txt
ここで、-Fでは、フィールド区切り文字として「、」を使用するawkに言っています。
唯一の要件が、各行の3番目のフィールドを印刷することであり、各フィールドがコンマで区切られている場合は、cutを使用できます。
cut -d, -f3 file
-d,
は、区切り文字をコンマに設定します-f3
は、3番目のフィールドのみが印刷されることを指定しますこれを試してくださいawk
awk -F, '{$0=$3}1' file
column3
,
フィールドを,
で分割する$0=$3
行をフィールドのみに設定3
1
すべて印刷します。 ( ここで説明 )これも使用できます:
awk -F, '{print $3}' file
bash の awk -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
$