次のような大きな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を返しました。誰かが私が間違っていることを教えてもらえますか?ありがとう。
スクリプトを実行するファイルには、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
も削除されます。
awk -F, '{if($7==-99)print $0}'
それを行います...
@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}
必要ない
awk -F',' '$7 ~ /-99/ {print $0}' filename.csv > result.csv
','
は区切り文字をカンマとして定義することに注意してください。
$
は列を定義します。したがって、$7
は、特別な値を設定する列番号を定義します。こちら7
。
~ /-99/
は-99
を検索します。必要なものは何でも入れます。
$0
は、ファイル内のすべての列を表します。特定の列だけを印刷したくない場合は、単に$1","$2","......
と書くことができます(または、結果の区切り文字としてカンマが必要ない場合は$1$2...
)。
> result.csv
は、出力をターミナルに出力する代わりにresult.scv
ファイルに保存します。