Awk를 사용하여 파일의 열 병합

Awk를 사용하여 파일의 열 병합

입력하다:

ABC,SSSD,12345,NSS,12345,xxx,TS11
,,,,,,TS21
,,,,,,TS22
,,,,,,BS26
,,,,,,GPRS
ABC,SSSD,12356,NSS,12356,xxx,TS11
,,,,,,TS21
,,,,,,TS22
,,,,,,GPRS
,,,,,,BS26

산출:

ABC,SSSD,12345,NSS,12345,xxx,TS11|TS21|TS22|BS26|GPRS
ABC,SSSD,12356,NSS,12356,xxx,TS11|TS21|TS22|GPRS|BS26

아래 스크립트를 작성해 보았습니다. 그러나 이는 성능 집약적입니다.

#!/bin/bash
head -2 $1 | tail -1 >> $1"_output"
sed '1,2d' $1 > temp$1.txt
cp temp$1.txt $1
rm -f temp$1.txt
while IFS='' read -r line || [[ -n $line ]]; do
    #    echo "main line -- "$line
    #    echo "prev line -- "$prevLine
    service=`echo $line | cut -d "," -f1`
    value=`echo $line | cut -d "," -f7`
    if [ "$service" != "" ]
    then
        if [ "$prevLine" != "" -a "$mvalue" != "" ]
        then
            echo $prevLine$mvalue >> $1"_output"
        fi
        prevLine=$line
        mvalue=""
    else
        #echo $value
        mvalue=$mvalue"|"$value
        #echo $mvalue
    fi
done < "$1"
echo $prevLine$mvalue >> $1"_output"

누구든지 awk를 사용하여 이를 수행하는 더 나은 방법이나 더 나은 방법을 제안할 수 있습니까?

답변1

공백에 대해 너무 까다롭지 않다면 다음과 같은 두 가지 awk 규칙을 사용하여 수행할 수 있습니다.

 awk '$1 { printf "\n" $0 } !$1 { printf OFS $7 }' FS=, OFS='|' infile

이렇게 하면 출력 시작 부분에 빈 줄이 남고 끝 부분에도 빈 줄이 남습니다. 이 문제를 해결하려면 ifAND END절을 추가하세요.

awk '$1 { if(NR>1) printf "\n"; printf $0 } !$1 { printf OFS $7 } END { printf "\n" }' FS=, OFS='|' infile

산출:

ABC,SSSD,12345,NSS,12345,xxx,TS11|TS21|TS22|BS26|GPRS
ABC,SSSD,12356,NSS,12356,xxx,TS11|TS21|TS22|GPRS|BS26

편집 - $0의 %를 참고하세요.

Glenn이 주석에서 지적했듯이 줄에 가 포함된 경우 형식 문자열을 사용하여 호출하는 것이 %더 안전합니다 . 예를 들면 다음과 같습니다.printf

awk '$1 { if(NR>1) printf "\n"; printf "%s", $0 } !$1 { printf OFS"%s", $7 } END { printf "\n" }' FS=, OFS='|' infile

답변2

병합할 행 수가 일정하다면 awk행 번호를 확인하여 행 유형을 확인할 수 있습니다.

$ awk -F, '1==NR%5 { printf $0 "|";next } { printf $7 (NR%5?"|":"\n") }' DATA
ABC,SSSD,12345,NSS,12345,xxx,TS11|TS21|TS22|BS26|GPRS
ABC,SSSD,12356,NSS,12356,xxx,TS11|TS21|TS22|GPRS|BS26

답변3

다른 sed:

sed ':;N;s/\n,,,*/|/;t;P;D' file

답변4

항상 동일한 수의 행(5)이 있는 경우 paste및 의 조합은 sed다음을 수행할 수 있습니다.

paste -d',' - - - - - <file | sed 's/,\{2,\}/|/g'

1) paste5줄을 ,구분 기호로 병합합니다. 2) 여러 개의(2개 이상의) 쉼표를 세로 막대로 바꿉니다.

관련 정보