我需要sample.csv
使用唯一列将以下文件 ( ) 拆分为多个文件(前 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
所需的输出文件应如下所示
样本_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
样本_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 列)。
样本_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
样本_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