4개의 열이 있는 텍스트 파일이 있고 데이터는 다음과 같습니다.
P_ID C_ID Code MSG
10 12 001 abcd
20 21 003 jklm
10 12 002 hijk
여기서 P_ID, C_ID, 코드 및 MSG는 열입니다.
C_ID 열에 대해 검색을 수행해야 합니다. 동일한 C_ID 값에 대해 여러 항목이 있지만 코드 및 msg 열 값이 다른 경우 최종 파일에는 아래 예상 출력 파일에 표시된 대로 결과가 있어야 합니다. 여기서 코드 및 msg 열 값은 쉼표로 구분되어 한 줄로 연결됩니다.
예상 출력은 다음과 유사해야 합니다.
P_ID C_ID Code MSG
10 12 001,002 abcd,hijk
20 21 003 jklm
출력은 다음과 같습니다.
1: NF=4
$1=[P_ID]
$2=[C_ID]
$3=[Code]
$4=[MSG]
2: NF=4
$1=[10]
$2=[12]
$3=[001]
$4=[abcd]
3: NF=4
$1=[20]
$2=[21]
$3=[003]
$4=[jklm]
4: NF=4
$1=[10]
$2=[12]
$3=[002]
$4=[hijk]
첫 번째 답변에 제공된 솔루션의 결과는 다음과 같습니다.
P_ID C_ID Code MSG
10 12 001 abcd
20 21 003 jklm
10 12 002 hijk
컬럼 이름과 해당 데이터를 확인하는 awk 명령은 잘 작동하지만, 답변으로 제공되는 첫 번째 명령은 예상한 결과를 제공하지 않습니다.
답변1
문제가 명확해지면 개선이 필요할 수 있지만, 현재 상태를 기준으로
awk '
BEGIN { unique_vals = 0 }
NR == 1 { print }
NR > 1 {
if (seen[$2] == "") {
i = seen[$2] = unique_vals++
P_ID[i] = $1
C_ID[i] = $2
Code[i] = $3
MSG[i] = $4
} else {
i = seen[$2]
Code[i] = Code[i] "," $3
MSG[i] = MSG[i] "," $4
}
}
END {
for (i=0; i<unique_vals; i++) {
printf "%-15s%-11s%-15s%s\n", P_ID[i], C_ID[i], Code[i], MSG[i]
}
}
' file
일을 하는 것 같습니다.
좋아, 나는 당신이 달리는 방법을 알고 있다고 가정합니다 awk
. 그렇지 않다면 그렇게 말하세요. 이렇게 하려면 다음 디버그 스크립트를 실행하세요.
awk '
{
print NR ": NF=" NF
print " $1=[" $1 "]"
print " $2=[" $2 "]"
print " $3=[" $3 "]"
print " $4=[" $4 "]"
}
' file
입력 파일에 추가하고 질문에 출력을 게시하세요. ("코드 펜스"를 사용하세요 ```
.) 그런 다음 여기에 또 다른 댓글을 남겨서 완료했음을 알려주세요.