grep 또는 awk를 사용하여 인덱스 파일의 중복 항목에 해당하는 중복 출력 행을 보고할 수 있습니까?

grep 또는 awk를 사용하여 인덱스 파일의 중복 항목에 해당하는 중복 출력 행을 보고할 수 있습니까?

목록의 상대적으로 간단한 색인 풀을 수행하기 위해 grep 또는 awk를 사용할 수 없는 것 같습니다. 나는 이것이 문제를 일으키고 있다고 생각하지 않는 인덱스 파일에 인접한 중복이 있기 때문에 이것이라고 생각합니다. 이상하게도 온라인에서 해결책을 찾는 것은 성공하지 못했습니다. 제가 찾은 모든 쿼리는 중복된 항목을 유지하기보다는 제거하기를 원하는 사람들에게서 나온 것이기 때문입니다!

인덱스 파일은 다음과 같습니다. 약 40,000개의 항목이 있으며 그 중 많은 항목이 중복 정렬되어 있습니다.

n0000003
n0000003
n0000008
n0000008
n0000017
n0000017
n0000017
n0000017
.....etc

검색 파일은 다음과 같습니다. 각 식별자에 대해 약 10,000개의 고유 항목이 있습니다.

n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
...etc

나에게 필요한 것은 인덱스 파일의 중복 인덱스 항목 수와 동일한 중복 출력 항목이 있는 다음과 같은 출력입니다.

n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
...etc

그러나 grep과 awk는 모두 하나의 항목만 제공합니다(파일을 검색하는 것과 동일하게 만듭니다). 나는 grep이 반복되는 중복을 아무 문제 없이 처리할 수 있다고 생각하지만, 그 문제를 해결할 수 있는 방법을 찾을 수 없습니다.

다음은 제가 작동할 것으로 예상하는 명령입니다. 예를 들면 다음과 같습니다.

grep -f index.txt searchfile.txt > output.txt
awk -F'\t' 'NR==FNR{c[$1]++;next};c[$1]' index.txt searchfile.txt > output.txt

정확한 반복 횟수를 출력하기 위해 grep 또는 awk를 얻는 방법에 대한 제안이 있으면 좋을 것입니다! 매우 감사합니다! 앤드류

답변1

내 생각에는 당신이 을 사용할 수 grep없을 것 같습니다. 하지만 당신은 그것을 하는 데 사용할 수 있습니다 awk. 제가 생각할 수 있는 가장 간단한 방법은 의 내용을 searchfile.txt메모리에 저장한 다음 인덱스를 볼 때마다 해당 행을 인쇄하는 것입니다.

$ awk -F'\t' 'NR==FNR{c[$1]=$0;next}{if(c[$1]){print c[$1]}}' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

두 파일이 모두 색인에 정렬되어 있으면 다음을 사용할 수도 있습니다 join.

$ join -t$'\t' searchfile.txt index.txt 
n0000003    216 -0.334  0.229   0.088   0.154
n0000003    216 -0.334  0.229   0.088   0.154
n0000008    16  0.117   0.200   0.508   0.621
n0000008    16  0.117   0.200   0.508   0.621
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084
n0000017    218 -0.353  0.196   0.042   0.084

답변2

당신의 시도를 보면 골 포스트에 거의 가까워졌지만 축구공이 골대를 넘어가도록 허용하지 않고 단지 시도에 while 루프를 추가하는 것 같습니다.

awk -F'\t' '
  FNR == NR { c[$1]++; next }
  k = c[$1] { while (k--) print }
' index.txt search.txt

관련 정보