web-dev-qa-db-ja.com

AWKを使用して特定の列に特定の値を持つ行を選択する

次のような大きなcsvファイルがあります。

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,25178
1,2,3,4,5,6,27986
1,2,3,4,5,6,-99

7番目の列が-99に等しい行のみを選択したいので、出力は次のようになります。

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99

私は以下を試しました:

awk -F, '$7 == -99' input.txt > output.txt
awk -F, '{ if ($7 == -99) print $1,$2,$3,$4,$5,$6,$7 }' input.txt > output.txt

しかし、どちらも空のoutput.txtを返しました。誰かが私が間違っていることを教えてもらえますか?ありがとう。

6
Isabela Martins

スクリプトを実行するファイルには、DOSの行末があります。 Windowsマシンで作成された可能性があります。

dos2unixを使用して、Unixテキストファイルに変換します。

または、trから実行します。

tr -d '\r' <input.txt >input-unix.txt

次に、input-unix.txtを他の点では正しいawkコードとともに使用します。


入力ファイルの代わりにawkコードを変更するには:

awk -F, '$7 == "-99\r"' input.txt >output.txt

これは行末の改行を考慮に入れています。

または、

awk -F, '$7 + 0 == -99' input.txt >output.txt

これにより、7番目の列が強制的に数値として解釈され、キャリッジリターンが「削除」されます。

同様に、

awk -F, 'int($7) == -99' input.txt >output.txt

\rも削除されます。

7
Kusalananda
awk -F, '{if($7==-99)print $0}'

それを行います...

1
tonioc

@toniocの回答を少し変更

awk '{if($7 == -99){print}}' file > outfile

パーティーには少し遅れますが、これで十分です

awk -F, '$7 ~ /-99/' input.txt > output.txt

あなたのように引用符を追加した場合、オリジナルも機能します

awk -F, '$7 == "-99"' input.txt > output.txt

パターンマッチを使用する場合のデフォルトのアクションは出力なので、{print}必要ない

0
Wayne
awk -F',' '$7 ~ /-99/ {print $0}' filename.csv > result.csv
  1. ','は区切り文字をカンマとして定義することに注意してください。

  2. $は列を定義します。したがって、$7は、特別な値を設定する列番号を定義します。こちら7

  3. ~ /-99/-99を検索します。必要なものは何でも入れます。

  4. $0は、ファイル内のすべての列を表します。特定の列だけを印刷したくない場合は、単に$1","$2","......と書くことができます(または、結果の区切り文字としてカンマが必要ない場合は$1$2...)。

  5. > result.csvは、出力をターミナルに出力する代わりにresult.scvファイルに保存します。

0
Tara