Unixファイルの一意の列を使用して複数のファイルに分割する

Unixファイルの一意の列を使用して複数のファイルに分割する

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

おすすめ記事