0

特定の列columnB(データセットの列 5) で文字列を検索し (大文字と小文字は区別されません)、別のcolumnC列 (データセットの列 10) にフィルターを適用する csv ファイルがあります。次に、選択した列をファイルに保存します。

データセットのサンプル

columnA     columnB    columnC  columnD
abc          Apple      100     today
nbd          apple      50      tomorrow
ccc          apple      101     today

希望の出力

columnB    columnC
Apple      100
apple      101

使用時の問題awk選択はできますcolumnBが、ヘッダーを出力できません。

 awk 'BEGIN {IGNORECASE = 1} {if($5 == "Apple") print $0 }' Data.csv> testPipe.txt

使ってみNR==1たのですが、なぜかうまくいきませんIGNORECASE

ここここの方法も試しました。

を使ってみたgripのですが、ヘッダーは出力できますcolumnBが、文字列一致の指定ができません。また、検索はすべての列に適用されます。

cat Data.csv |{ head -1; grep -I "Apple";} | awk -F',' '{ if ($10 >100 ) { print } }'>testPipe.txt

両方の方法を組み合わせて目的の出力を得る方法はありますか? ありがとう

4

2 に答える 2

2

関数を使用しますtolower()

awk 'NR==1{print; next} tolower($5) == "apple"' file

説明:

# Print the headers
NR==1 {
    print
    next
}

# Print the current line if $5 matches the condition
# Note that if there is no action specified, awk will
# use print $0 by default
tolower($5)

条件が真の場合にさらにアクションを書きたい場合は、それらをブロックに入れます

tolower($5) {
    ...
}

IGNORECASEが GNU awk でのみ動作するのとは対照的に、tolower()は のどのバージョンでも動作しますawk。これは POSIX で定義されているためです。

于 2019-09-22T07:03:18.937 に答える