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
게시된 샘플 입력에 표시된 대로 입력이 word
및 필드 모두에서 정렬되었다고 가정합니다.type
$ 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
위의 내용은 모든 UNIX 상자의 모든 쉘에서 awk를 사용하여 작동하며 메모리에 한 번에 한 줄만 저장하고 입력과 동일한 순서로 출력을 생성합니다.
답변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
이를 위해서는 Linux 시스템의 기본값인 awk
GNU awk( )와 같은 다차원 배열을 이해하는 구현이 필요합니다.gawk
awk