모든 텍스트 파일의 줄만 한 번 이상 표시

모든 텍스트 파일의 줄만 한 번 이상 표시

a.txt

cat a.txt
a
b
x
c

b.txt

cat b.txt
d
e
a
f

큐:

SOMEMAGICK *.txt
a

묻다:모든 *.txt 파일의 줄만 표시하는 방법은 무엇입니까?

답변1

어때요?

cat *.txt | sort | uniq -c | egrep "^ +$(ls -1 *.txt | wc -l) "

그런 다음 발생 횟수를 줄이려면 추가할 수 있습니다.

cat *.txt | sort | uniq -c | egrep "^ +$(ls -1 *.txt | wc -l) " | sed -re 's/^ +[0-9]+ //'

@Stephane의 의견에 따르면 단일 파일에 한 줄이 여러 번 나타나면 위의 내용이 작동하지 않습니다. 여기서는 이를 방지하기 위해 먼저 각 파일을 정렬하고 고유화합니다.

for f in *.txt; do sort -u $f > $f.uniqd; done
cat *.uniqd | sort | uniq -c | egrep "^ +$(ls -1 *.uniqd | wc -l) " | sed -re 's/^ +[0-9]+ //'

지금은 더 이상 줄이 아니지만. :)

답변2

awk 'FNR == 1 { FILENUM++ }
     SEEN[$0] == FILENUM - 1 { SEEN[$0] = FILENUM }
     END { for (s in SEEN) if (FILENUM == SEEN[s]) print s }' *.txt

설명하다

각 파일의 첫 번째 줄을 읽을 때 FILENUM읽을 때N첫 번째 파일 FILENUMN.

각 줄을 읽을 때 본 파일의 수를 세십시오(그러나 이전의 모든 파일에서 본 경우에만 이 작업을 수행해야 합니다).

더 이상 읽을 입력이 없으면 모든 파일에 표시된 모든 줄을 인쇄합니다.

경고하다:여기에 게시된 여러 솔루션과 마찬가지로 이 솔루션에도 약점이 있습니다. 질문에 따르면 입력 파일이 비어 있으면 다음이 있어야 합니다.출력이 전혀 안됨. 그러나 awk는 라인 지향 도구이므로 빈 파일을 무시합니다. 즉, 빈 파일의 경우 FNR == 1 { FILENUM++ }늘릴 수 없습니다.FILENUM

GNU awk를 사용하면 다음 명령을 사용하여 이 오류를 수정할 수 있습니다.ARGIND내장 변수.

gawk 'SEEN[$0] == ARGIND - 1 { SEEN[$0] = ARGIND }
      END { for (s in SEEN) if (ARGIND == SEEN[s]) print s }' *.txt

답변3

GNU awk 사용

awk '{
      x[$0][FILENAME]
     }
     END{
      num_files=ARGC-1;
      for (b in x)
       if (length(x[b]) == num_files) 
        print b
     }' a.txt b.txt c.txt

답변4

나는 더 간단한 솔루션을 사용하는 것을 선호합니다 join.

join <(sort a.txt) <(sort b.txt)

이는 두 입력 파일 모두에서 작동하지만 공백이 포함된 줄에서는 예상대로 작동하지 않을 수 있으며 중복된 줄이 여러 번 출력됩니다.

두 번째 문제를 해결하려면,

join <(sort a.txt) <(sort b.txt) | uniq

첫 번째는 좀 더 복잡하지만, -t발생하지 않는 문자를 필드 구분 기호로 사용하여 flags 로 약간 속임수를 썼습니다.

$ cat a.txt 
This test
foo bar
does work
$ cat b.txt 
This is a test
foo does not work
does work
$ join <(sort a.txt) <(sort b.txt) | uniq
does work work
foo bar does not work
This test is a test
$ join -t : <(sort a.txt) <(sort b.txt) | uniq
does work

관련 정보