![열 값을 쉼표로 구분하는 방법은 무엇입니까?](https://linux55.com/image/94565/%EC%97%B4%20%EA%B0%92%EC%9D%84%20%EC%89%BC%ED%91%9C%EB%A1%9C%20%EA%B5%AC%EB%B6%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 같은 단일 값 열을 포함하는 입력 파일이 있습니다.
입력 파일:
B00000|1|def|b12
B00001|1|xyz|
B00000|1||b11
B00001|1|def|ab1
B00001|2|ghi|bc2
B00002|1|abc|ac1
B00002|1|xyz|bc2
출력을 얻으려면 첫 번째 및 두 번째 열을 기준으로 세 번째 및 네 번째 열의 데이터를 분리해야 합니다.
산출:
B00000|1|def|b11,b12
B00001|1|def,xyz|ab1
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
답변1
#!/usr/bin/gawk -f
BEGIN { OFS=FS="|"}
a[$1][$2][3] { a[$1][$2][3] = a[$1][$2][3] "," $3;
a[$1][$2][4] = a[$1][$2][4] "," $4;
next }
{ a[$1][$2][3] = $3;
a[$1][$2][4] = $4 }
END { for (b in a)
for(c in a[b]) print b,c,a[b][c][3],a[b][c][4] }
awk 대응 부분에 대해서는 아래 @dave_thompson_085의 설명을 참조하십시오(1D 배열 사용).
답변2
$ cat ip.txt
B00000|1|def|b12
B00001|1|xyz|a11
B00000|1|abc|b11
B00001|1|def|ab1
B00001|2|ghi|bc2
B00002|1|abc|ac1
B00002|1|xyz|bc2
$ perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }
' ip.txt
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
B00000|1|def,abc|b12,b11
B00001|1|xyz,def|a11,ab1
- 입력 라인은 세 부분으로 나누어집니다(예:
B00000|1|
,def
및 )b12
. 줄의 후행 공백은 무시됩니다. - 동일한 키를 가진 두 개의 서로 다른 해시 변수에는 value
$v1
및$v2
가 추가됩니다.,
키의 해시가 비어 있지 않은 경우 추가 - 모든 라인이 처리된 후 출력을 인쇄합니다.
입력과 키가 정렬된 경우:
$ sort ip.txt | perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (sort keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }'
B00000|1|abc,def|b11,b12
B00001|1|def,xyz|ab1,a11
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2