![여러 파일에서 공통 번호를 찾는 방법은 무엇입니까?](https://linux55.com/image/166367/%EC%97%AC%EB%9F%AC%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EA%B3%B5%ED%86%B5%20%EB%B2%88%ED%98%B8%EB%A5%BC%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
모든 파일에 존재하는 공통번호를 추출하고 싶습니다. 내 폴더에는 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.txt
10,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
이렇게 하면 중복된 번호가 있는 모든 파일이 나열되고 각 개별 파일이 정렬됩니다.