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