아래와 같은 파일이 있습니다..
abc, 12345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 56345
def, text and nos
ghi, something else
jkl, words and numbers
abc, 15475
def, text and nos
ghi, something else
jkl, words and numbers
abc, 123345
def, text and nos
ghi, something else
jkl, words and numbers
다음으로 변환(결합)하고 싶습니다.
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos,text and nos,text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
답변1
출력 순서가 마음에 들지 않으면 다음을 수행하십시오.
$ awk -F',' 'NF>1{a[$1] = a[$1]","$2};END{for(i in a)print i""a[i]}' file
jkl, words and numbers, words and numbers, words and numbers, words and numbers
abc, 12345, 56345, 15475, 123345
ghi, something else, something else, something else, something else
def, text and nos, text and nos, text and nos, text and nos
설명하다
NF>1
즉, 비어 있지 않은 줄만 처리하면 됩니다.- 모든 첫 번째 필드를 연관 배열에 저장합니다
a
. 키는 첫 번째 필드이고 값은 두 번째 필드(또는 행의 나머지 부분)입니다. 키에 이미 값이 있으면 두 값을 연결합니다. END
블록 내에서 연관 배열을 반복하여a
모든 키와 해당 값을 인쇄합니다.
또는 다음 perl
순서를 유지합니다.
$perl -F',' -anle 'next if /^$/;$h{$F[0]} = $h{$F[0]}.", ".$F[1];
END{print $_,$h{$_},"\n" for sort keys %h}' file
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos, text and nos, text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
답변2
아, 그거 쉽지요. 다음은 파일에 나타나는 순서대로 키를 유지하는 간단한 버전입니다.
$ awk -F, '
/.+/{
if (!($1 in Val)) { Key[++i] = $1; }
Val[$1] = Val[$1] "," $2;
}
END{
for (j = 1; j <= i; j++) {
printf("%s %s\n%s", Key[j], Val[Key[j]], (j == i) ? "" : "\n");
}
}' file.txt
출력은 다음과 같아야 합니다.
abc, 12345, 56345, 15475, 123345
def, text and nos, text and nos, text and nos, text and nos
ghi, something else, something else, something else, something else
jkl, words and numbers, words and numbers, words and numbers, words and numbers
끝에 추가 빈 줄이 마음에 들지 않으면 printf
줄을 다음으로 바꾸 십시오.printf("%s %s\n\n", Key[j], Val[Key[j]]);