sample.csv
次のfile()を一意の列を使用して複数のファイルに分割する必要があります(最初の3つは一意の列です)。
サンプル.csv
123|22|56789|ABCDEF|12AB34|2019-07-10|2019-07-10|443.3400|1|1
123|12|5679|BCDEFG|34CD56|2019-07-10|2019-07-10|896.7200|1|2
123|12|5679|CDEFGH|45DE67|2019-07-10|2019-07-10|680.9200|1|1
123|22|56789|DEFGHI|56EF78|2019-07-10|2019-07-10|405.8800|1|2
必要な出力ファイルは次のとおりです。
Sample_123_22_56789.csv
123|22|56789|ABCDEF|12AB34|2019-07-10|2019-07-10|443.3400|1|1
123|22|56789|DEFGHI|56EF78|2019-07-10|2019-07-10|405.8800|1|2
Sample_123_12_5679.csv
123|12|5679|BCDEFG|34CD56|2019-07-10|2019-07-10|896.7200|1|2
123|12|5679|CDEFGH|45DE67|2019-07-10|2019-07-10|680.9200|1|1
以下のコマンドを使用していますが、うまくいきますが、ハードコードせずに通常にしたいと思います。$4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10
awk -F\| '{print $4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10 >
sample_"$1"_"$2"_"$3".CSV"}' sample.csv
アップデート#1
返信ありがとうございます。混乱させて申し訳ありません。私が望む出力は次のとおりです(最初の3列を除く)。
Sample_123_22_56789.csv
ABCDEF|12AB34|2019-07-10|2019-07-10|443.3400|1|1 DEFGHI|56EF78|2019-07-10|2019-07-10|405.8800|1|2
Sample_123_12_5679.csv
BCDEFG|34CD56|2019-07-10|2019-07-10|896.7200|1|2 CDEFGH|45DE67|2019-07-10|2019-07-10|680.9200|1|1
答え1
「ユニバーサル」が列の数を変更できることを意味し、常に最初の3つのフィールドで定義された名前のファイルにすべての列を書き込む場合は、次のことを試すことができます。
awk -F\| '{
data=$4
for(i=5;i<=NF;i++){
data = data"|"$(i)
}
print data > "sample_"$1"_"$2"_"$3".CSV"}' sample.csv
もちろん、それがあなたの命令がすることです。あなたの質問に示されている希望の出力は生成されませんが、これは目的の出力がコマンドと一致しないためです。含めたい場合みんな例に示すように、出力のフィールドは代わりに次を使用します。
awk -F\| '{
data=$1
for(i=2;i<=NF;i++){
data = data"|"$(i)
}
print data > "sample_"$1"_"$2"_"$3".CSV"}' sample.csv
答え2
次のコマンドを試してください。素晴らしい作品。
for i in `awk -F "|" '{if (!seen[$2]++)print $2}' file2.txt `; do awk -v i="$i" -F "|" '$2==i{print $0}' file2.txt >sample_123_"$i"_56789.csv; done
出力
praveen:~$ cat sample_123_22_56789.csv
123|22|56789|ABCDEF|12AB34|2019-07-10|2019-07-10|443.3400|1|1
123|22|56789|DEFGHI|56EF78|2019-07-10|2019-07-10|405.8800|1|2
cat sample_123_12_56789.csv
123|12|5679|BCDEFG|34CD56|2019-07-10|2019-07-10|896.7200|1|2
123|12|5679|CDEFGH|45DE67|2019-07-10|2019-07-10|680.9200|1|1