3

次のような 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で作業しています

4

3 に答える 3

5

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 を、チェックする列の適切な名前に置き換えます。

于 2012-10-25T16:01:07.290 に答える
2

次のアドレスを使用できます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 回繰り返されます。

値にコンマを含めることができる真の CSV ファイルの場合は、Perl およびText::CSVに切り替えます。

于 2012-10-25T15:55:50.183 に答える
1
$ 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を使用するだけです。コードはより明確になり、必要に応じて将来的に拡張するのがはるかに簡単になります。

于 2012-10-25T16:55:47.237 に答える