의사소통

의사소통

저는 간단한 작업을 수행하려고 하므로 grep존재하는 행과 존재하지 않는 행을 가져옵니다 grep -v.a.txtb.txtc.txt

3개 파일의 예

a.txt:

a
b
c
d
e

up.txt:

a.up
b.up
c.up

dw.txt:

a.dw
b.dw

원하는 출력:

c

다음 코드를 작성했지만 grep전체가 아닌 매번 한 줄처럼 보입니다.$(sed...)

sed 's/.up//' /tmp/b.txt | grep -f /tmp/a.txt | grep -vf $(sed 's/.dw//' /tmp/c.txt)

답변1

단일 빠른 GNU 사용awk주문하다:

awk -F'.' \
'{
     if (ARGIND == 1) a[$1];
     else if (ARGIND == 2 && $1 in a) comm[$1];
     else if (ARGIND == 3){
         delete a;
         if ($1 in comm) delete comm[$1]
     }
 }
 END{ for (i in comm) print i }' a.txt b.txt c.txt

산출:

c

  • -F'.'- .필드 구분자로 처리됩니다.
  • ARGINDARGV-현재 처리 중인 파일에 대한 인덱스(명령줄 인수 배열)
  • comm- 배열흔한a.txt처음 2개 파일(및 ) b.txt사이의 항목

답변2

파일이 모두 정렬되어 있고 프로세스 대체를 이해하는 셸(예 bash: )을 사용한다고 가정합니다.

$ join -t . -v 1 -o 0 <( join -t . a.txt b.txt ) c.txt
c

또는 다른 껍질의 경우

$ join -t . a.txt b.txt | join -t . -v 1 -o 0 - c.txt
c

join이는 파일 간의 관계형 조인을 수행하는 데 두 번 사용됩니다 . 데이터는 점으로 구분된 필드( 사용)로 해석됩니다 -t ..

a.txt과 사이의 연결은 b.txt직접적이며 다음을 생성합니다.

a.up
b.up
c.up

이는 두 파일 모두에 점으로 구분된 첫 번째 필드가 나타나는 두 파일의 모든 줄입니다. 출력은 연결된 필드( a, b, c)와 두 파일의 다른 필드( b.txt추가 데이터)로 구성됩니다.

두 번째 연결은 조금 특별합니다. -v 1두 번째 파일의 어떤 줄과도 짝을 이룰 수 없는 첫 번째 파일(위의 중간 결과)의 항목을 확인하라는 요청을 받습니다 c.txt. 또한 조인 필드 자체( -o 0)만 보도록 요청합니다. 플래그 가 없으면 결과를 -o얻습니다 .c.up


파일이 정렬되지 않은 경우 각 파일 이름은 명령에서 로 바뀔 수 있습니다 file.<( sort file )

답변3

의사소통

파일이 정렬되고 중복된 줄이 제거되었다고 가정합니다.

comm -12 a.txt <(cut -d. -f1 b.txt) | comm -23 - <(cut -d. -f1 c.txt)

이것은 Bash 및 GNU 유틸리티를 사용하여 Ubuntu용으로 작성되었지만 다른 운영 체제에서도 작동할 수 있기를 바랍니다.

설명하다

  • comm -12두 파일이 공유하는 줄 인쇄( man comm자세한 내용은 읽어보세요)
  • <(...)프로세스 대체 - 입력 파일 대신 명령 사용
  • cut -d. -f1각 줄에 대해 첫 번째 점 뒤의 모든 항목을 삭제합니다.
  • comm -23첫 번째 파일에 고유한 줄을 인쇄합니다.
  • -파일 대신 표준 입력에서 읽기

답변4

perl -F\\. -lane '
   $h{@ARGV}{$F[0]}++,next if @ARGV;
   print if exists $h{2}{$_} && !exists $h{1}{$_};
' up.txt dw.txt a.txt

최상위 키 "2"와 "1"을 사용하여 해시 %h를 구성합니다. 여기서 2는 첫 번째 인수(up.txt)를 나타내고 1은 dw.txt를 나타냅니다. 주어진 데이터에 대해 해시 구조는 다음과 같습니다. (순서는 다를 수 있습니다)

%h = (
   1 => { a => 1, b => 1, },
   2 => { a => 1, b => 1, c => 1, },
);

보시다시피, 메인 해시 %h에는 두 개의 미니 해시가 있습니다. 따라서 세 번째 매개변수(a.txt)를 읽을 때가 되면 레코드가 메인 해시의 미니 해시 %2 및 미니 해시 %1에서 키로 표시되는지 여부를 기반으로 합니다. %h 이내(해시 해시 또는 HoH라고도 함)

관련 정보