ファイルからデータを抽出し、1つの列値に基づいて異なるファイルに配置します


13

以下の値でcsvファイルを生成します

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

データを抽出し、2番目の列に基づいてファイルを作成する必要があります。577の場合、行全体を抽出して別のファイルに配置する必要があります。つまり、2番目の列が577だけの行と、2番目の列が132だけの別のファイルが必要です。

IFを使用しようとしましたが、動作しませんでした


5
実際に動作しないコードを投稿することは常に良い考えです。
goldilocks 14

回答:


26

使用awk

awk -F, '{ print > $2 ".csv" }' file.csv

これは、2つのファイルを作成します577.csvし、132.csvあなたの現在のディレクトリにあります。

上記のコマンドでは、132または5772番目のフィールドのみを使用できると想定しています。全体の2番目のフィールドにある値ごとに1つのファイル名を作成しますfile.csv

関心のある2つ以外の値があり、それらの行を無視する場合は、代わりにこれを実行します。

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
awk使用できないバグのある実装がありますprint > $2 ".cvs"。それらについては、最初にファイル名を計算し、次にprint:を実行する必要がありますfname = $2 ".cvs"; print > fname
クサラナナンダ

3

私はterdonのawk解決策が好きですが、完全を期すために、ここではbash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

これは、ファイルが生成されます577.csv132.csv、現在のディレクトリにあります。


3

すべての577を標準出力に抽出するには

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

-編集1以下の@terdonのコメントに基づいて修正され、577の行に少なくとも3つのコンマがある場合に誤った一致を回避します。

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

しかし、彼/彼女のawkソリューションはより包括的なものだと思います。


これは、577が2番目ではなく別のフィールドにある場合、またはフィールドの一部である場合でも一致します。たとえばfoo577barまたはyp9012,132,8,577
テルドン

私は私のコンマがそれをフィールドの位置に依存させると思いましたか?
Xティエン

申し訳ありませんが、悪い例を挙げましたが、.*コンマも一致するため、一致するフィールドがわかりません。2番目、45番目の可能性があります。2番目の不満は間違っていました。コンマが一致することを防ぐのは正しいことですfoo577bar
テルドン

どうしたらいいですか| の代わりに文字が使用されます。
user3116123

以下のエラーを受信grep:illegal option-e使用法:grep -hblcnsviw pattern file。。。
user3116123 14

1

を使用してcsvkit

$ csvgrep -c 2 -m 577 data.csv >output.csv

-c 2作るには、cvsgrep第二のカラムを考慮し、と-m 577私たちは、文字列一致するように依頼し577、その列のを。

以下はに書き込まれoutput.csvます:

yp1234,577,1,3
yp5678,577,3,5

いくつかの文字列を照合し、各文字列の出力をファイルに書き込むには:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

これにより、2つのファイルoutput-132.csvとが作成されますoutput-577.csv

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.