행의 다음 부분을 3열 파일의 현재 행에 병합합니다.

행의 다음 부분을 3열 파일의 현재 행에 병합합니다.

word @@@ type @@@ sentence각 줄의 서식이 지정되고 "단어"를 기준으로 오름차순으로 정렬된 텍스트 파일이 있습니다 . 그러나 일부 줄은 고유하지 않으며 이전 줄과 동일한 단어로 시작합니다. 즉, 아래 word1을 참조하세요.

...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1
word1 @@@ type1 @@@ sentence2
word1 @@@ type1 @@@ sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...

문장을 추가하여 동일한 단어 및 유형 조합이 있는 줄을 한 줄로 결합하고 싶으므로 파일 결과는 다음과 같습니다.

...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...

단어 및 유형 필드에는 공백이 없습니다.

답변1

wordtype게시한 예제 입력에 표시된 것처럼 입력이 및 필드에 대해 정렬된다고 가정합니다 .

$ cat tst.awk
BEGIN { FS=" @@@ "; ORS="" }
{ curr = $1 FS $2 }
curr != prev {
    printf "%s%s", ORS, $0
    prev = curr
    ORS = RS
    next
}
{ printf " ;;; %s", $NF }
END { print "" }

$ awk -f tst.awk file
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5

위의 코드는 awk를 사용하는 모든 UNIX 시스템의 모든 쉘에서 작동하고 한 번에 한 줄만 메모리에 저장하며 입력과 동일한 순서로 출력을 생성합니다.

답변2

이것은 awk의 방법입니다.

$ awk -F'@@@' '{ $1 in a ? a[$1][$2]=a[$1][$2]" ;;; "$3 : a[$1][$2]=$3}END{for(word in a){for (type in a[word]){print word,FS,type,FS,a[word][type]} }}' file 
word0  @@@  type2  @@@  sentence0
word1  @@@  type1  @@@  sentence1 ;;;  sentence2 ;;;  sentence3
word1  @@@  type2  @@@  ;;;  sentence4
word2  @@@  type1  @@@  sentence5

또는 더 명확하게 말하면 다음과 같습니다.

awk -F'@@@' '{ 
                if($1 in a){ 
                    a[$1][$2]=a[$1][$2]" ;;; "$3
                }
                else{
                    a[$1][$2]=$3
                }
             }
             END{
                 for(word in a){
                     for (type in a[word]){
                         print word,FS,type,FS,a[word][type]
                     }
                 }
             }' file 

이를 위해서는 awkLinux 시스템의 기본 구현인 GNU awk()와 같은 다차원 배열을 이해하는 구현이 필요합니다 gawk.awk

관련 정보