각 줄에 문자열이 포함된 텍스트 파일이 있습니다. 예를 들면 다음과 같습니다.
zanzibar
apple
banana
apple
carrot
banana
sausage
apple
apricot
tea
apple
apple
파일을 읽고, 각 단어의 수를 세고, 5보다 작은 단어를 제거하려고 합니다. 5번 이상 나타나는 단어는 한 번만 나타납니다.
위의 경우 새 파일에는 다음이 있어야 합니다.
apple
파일에 5번 이상 등장하기 때문이죠.
지금까지 시도한 것은 1단계 -> 5번 미만으로 나타나는 문자열을 제거하는 것인데, 그것마저도 작동하지 않는 것 같습니다. 새 파일은 비어 있습니다.
awk -F'\n' '
FNR==NR{ seen[tolower($1)]++; next }
seen[tolower($1)]
seen[tolower($1)]<5{ delete seen[tolower($1)] }
' all.txt 5-or-more.txt
고쳐 쓰다:
다음 명령을 실행하고 있습니다.
awk '{ a[tolower($1)]++ }
END{
for(word in a){
if(a[word]>5){ print word }
}
}' all.txt > sorted.txt
답변1
당신이 원하지 않는 -F'\n'
. 이는 필드 구분자를 개행 문자로 설정하고 레코드 구분자가 동일하게 유지되기 때문에 유용한 작업을 전혀 수행하지 않습니다 \n
.
필요한 것은 이것뿐입니다:
$ awk '{ a[tolower($1)]++ }
END{
for(word in a){
if(a[word]>=5){ print word }
}
}' file
apple
이는 각 단어( $1
)를 배열의 키로 저장하고 a
단어가 표시될 때마다 해당 값을 증가시킵니다. 그런 다음 파일 끝에서 in 값이 5보다 크거나 같은 단어를 반복하여 a
인쇄합니다 .a
답변2
그 일은 평범한 것 같습니다.
awk '++A[$0] == 5' file1 >file2
아마도 == 6
5번 이상일 수도 있고 한 번 인쇄할 수도 있습니다.
답변3
사용 sort
하고 uniq -c
계산하는 것이 더 쉬울 수 있습니다.
$ sort --ignore-case all.txt |
uniq -c --ignore-case |
awk '$1 >= 5 {print $2}'
apple
답변4
datamash
이는 및 를 사용하여 수행할 수 있습니다 awk
.
$ datamash -i -sW -g 1 count 1 <file | awk '$2 >= 5 {print $1}'