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첫 번째 파일 FILENUM
은N.
각 줄을 읽을 때 본 파일의 수를 세십시오(그러나 이전의 모든 파일에서 본 경우에만 이 작업을 수행해야 합니다).
더 이상 읽을 입력이 없으면 모든 파일에 표시된 모든 줄을 인쇄합니다.
경고하다:여기에 게시된 여러 솔루션과 마찬가지로 이 솔루션에도 약점이 있습니다. 질문에 따르면 입력 파일이 비어 있으면 다음이 있어야 합니다.출력이 전혀 안됨. 그러나 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