1열을 기준으로 여러 행을 연결합니다.

1열을 기준으로 여러 행을 연결합니다.

아래와 같은 파일이 있습니다..

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]]);

관련 정보