여러 파일에서 공통 번호를 찾는 방법은 무엇입니까?

여러 파일에서 공통 번호를 찾는 방법은 무엇입니까?

모든 파일에 존재하는 공통번호를 추출하고 싶습니다. 내 폴더에는 1000개의 파일이 있습니다. 모든 파일 번호를 비교하여 1000개의 파일 중에서 공통되는 번호를 찾고 싶습니다. 다음 코드를 사용했습니다.

for ((i=2;i<=10000;i++))  
do
comm -12 --nocheck-order a.txt "$i".txt > final.txt
mv final.txt file.txt
done

하지만 마지막 파일만 a.txt로 다시 작성하고 비교합니다. 하지만 모든 파일에 범용 번호가 존재하기를 원합니다.

.txt 파일이 있다고 가정합니다.

1
3
47
8
6
7

1.txt 파일:

2
3
6
7
8

2.txt 파일:

3
5
6
7
9

3.txt 및 4.txt....1000.txt. 이것이 이 3개 파일에서 잘 작동한다면 모든 파일에서도 잘 작동할 것입니다. 이 파일에서 일반적으로 발견되는 내용은 다음과 같습니다.

3
7

나에게 주어졌을 때

3
8
3

어떻게 진행하면 되는지 알려주세요.

답변1

각 숫자가 파일에 한 번만 나타난다고 가정합니다.

$ awk '{c[$1]++} END{for (i in c) if (c[i] == (ARGC-1)) print i}' a.txt {1..2}.txt
3
6
7

답변2

comm정렬된 파일에서만 작동합니다.

비교하다정렬됨FILE1 및 FILE2 파일을 한 줄씩 읽습니다.

원천:https://linux.die.net/man/1/comm

따라서 이 알고리즘은 정렬되지 않은 파일에서는 작동하지 않습니다. 이것은 작동합니다:

#!/bin/sh

sort -n a.txt > tmp.txt

END=4

for i in `seq 2 $END`
do
comm -12 --nocheck-order tmp.txt $i.txt |tee tmp.txt
done
cp tmp.txt "final.txt"

이 외에도 일부 시스템에서는 연산자를 사용할 |tee수도 있습니다 (파일에 쓰고 덮어쓰기).>

답변3

가장 먼저 알아야 할 것은 comm여러 파일 간의 공통 행을 올바르게 보고하려면 정렬된 입력 파일을 전달해야 한다는 것입니다(이전에 정렬되지 않은 경우).

mv둘째, 이전 시도의 결과를 기반으로 다음 파일을 확인하려면 명령을 ;로 변경 해야 합니다. mv final.txt a.txt여기서는 백업을 가져와 for 루프에서 반복했습니다 a.txt.common.txt

따라서 다음과 같은 최종 스크립트가 생성됩니다.

cp a.txt common.txt
for ((i=1;i<=10000;i++));
    do comm -12  <(sort common.txt) <(sort $i.txt) >temp.txt;
    mv temp.txt common.txt;
done

끝은 cat common.txt10,000개의 파일에 공통적으로 나타나는 줄입니다.

답변4

다른 문제 중 하나는 스크립트가 comm루프에서 10000번 호출되어 속도가 매우 느려지는 것입니다. 더 빠른 대안은 모두 정렬하고 반복 횟수를 계산하는 것입니다. 모든 파일에는 파일 수와 동일한 행이 있습니다(각 파일 내에서 값이 반복되지 않는 경우).

set -- ./*.txt
sort -n "$@" | uniq -c | awk -vcount="$#" '$1==count{print $2}'

위치 매개변수를 사용하여 파일 목록 "$@"과 파일 개수를 가져옵니다 $#.

-n요청하면 정렬이 숫자로 이루어집니다.숫자.

당신은 할 수확인하다(및 정렬됨) 파일에 중복된 번호가 없습니다.

set -- ./*.txt

for    f; do
       sort -n "$f"          > "$f.tempfile"
       mv      "$f.tempfile"   "$f"
       if [ "$(uniq -d "$f")" != "" ]; then echo $f; fi
done

이렇게 하면 중복된 번호가 있는 모든 파일이 나열되고 각 개별 파일이 정렬됩니다.

관련 정보