次のような CSV ファイルがあります。
A,B,C
1,2,3
4,4,4
1,2,6
3,6,9
B 列が 2 であるすべての行を grep し、ヘッダーを保持する簡単な方法はありますか? たとえば、出力を次のようにしたい
A,B,C
1,2,3
1,2,6
Linuxで作業しています
awk の使用:
awk -F, 'NR==1 || $2==2' file
NR==1 -> 最初の行の場合、$2==2 -> 2 番目の列が 2 の場合。上記のいずれかが true の場合、行が出力されます。
ヘッダー列名を使用して列を選択するには:
awk -F, -v col="B" 'NR==1{for(i=1;i<=NF;i++)if($i==col)break;print;next}$i==2' file
B を、チェックする列の適切な名前に置き換えます。
次のアドレスを使用できますsed
。
sed -n '1p;/^[^,]*,2/p'
その意味は:
1p Print the first line.
/ Start a match.
^ Match the beginnning of a line.
[^,] Match anything but a comma
* zero or more times.
, Match a comma.
2 Match a 2.
/p End of match, if it matches, print.
探している値がヘッダーに含まれている可能性がある場合は、より注意する必要があります。
sed -n '1p;1!{/^[^,]*,2/p}'
1!{ ... }
単に「最初の行以外の行に対して次を実行する」ことを意味します。
列番号n>2
の場合、量指定子を追加できます。
sed -n '1p;1!{/^\([^,]*,\)\{M\}2/p}'
どこでM=n-1
。量指定子は繰り返しを意味するだけなので、非コンマ 0 回以上のコンマは M 回繰り返されます。
$ awk -F, 'NR==1 { for (i=1;i<=NF;i++) h[$i] = i; print; next } $h["B"] == 2' file
A,B,C
1,2,3
1,2,6
ちなみに、sedは、1行で単純に置換するための優れたツールです。それ以外の場合は、awkを使用するだけです。コードはより明確になり、必要に応じて将来的に拡張するのがはるかに簡単になります。