설명하다

설명하다

예를 들어 다음과 같은 파일이 있습니다.

B01 112178282 A01 112178282
A05 44887670 A01 44887670
B01 114451441 A01 114451441
B10 8364597 A01 8364597
B01 123453906 A01 123453906
A05 9155966 A01 9155966
A05 86420950 A01 86420950
A10 75684694 A01 75684694
A04 71261964 A01 71261964
B01 1262441 A01 1262441
B01 471272 A01 471272
B01 17007 A01 17007
A04 115637044 A01 115637044
A07 9376758 A01 9376758

두 개의 별도 출력 파일을 원합니다

  1. 언제num val in col1 == num val in col3
  2. 두 번째 출력 파일은 다음과 같아야 합니다.num val in col 1 != num val in col 3

예를 들어 col1은 B01이고 col3은 A01입니다. 여기서 두 열의 숫자 부분은 동일합니다 01. 이제 이러한 모든 조건이 file1에 나열되어야 합니다.

col1이 A05이고 col3이 A01이고 두 열의 숫자 부분이 다른 07 != 01경우 다른 파일에 나열되어야 합니다2

답변1

awk 'substr($1,2)==substr($3,2) { print $0 > "file1" } substr($1,2) != substr($3,2) { print $0 > "file2" }' masterfile

원시 데이터가 포함된 마스터파일을 사용하고 awk의 substr 함수를 사용하여 필드의 첫 글자를 구분하는 첫 번째와 세 번째 공백을 무시하고 비교할 숫자만 남겨 둡니다. 그런 다음 이 숫자에 대해 조건부 검사를 수행하고 그에 따라 특정 파일(파일 1 및 파일 2)에 배치합니다.

답변2

을 사용하면 두 개의 파일이 생성됩니다. awk 1 과 3 의 숫자 부분 동일한 행은 별도의 파일로 이동하고 해당 열이 다른 행은 다른 파일로 이동합니다.

awk -F"[A B]" '{
    print >(($2==$5)?"matches.txt":"non_matches.txt")
}' infile.txt

그러면 awk의 필드 구분 기호가 공백 문자 세트로 설정되고 A비교 B되어 숫자 부분이 동일하면 현재 행이 "matches.txt" 파일에 기록되고, 그렇지 않으면 "non_matches.txt" 파일에 기록됩니다. txt" 파일입니다.

답변3

perl -alMFatal=open -pe '
   BEGIN{ unlink, open *{+uc}, ">>$_" for qw/file1.log file2.log/; }
   select $F[0] =~ s/^\D*//r eq $F[2] =~ s/^\D*//r ? *{"FILE1.LOG"} : *{"FILE2.LOG"};
' sample.txt

설명하다

  • Perl옵션:
    • -a행은 공백을 기준으로 전달할 수 있는 필드로 분할됩니다.$F[0] $F[1] ...
    • -lRS개행 및 개행으로 설정됩니다 ORS.
    • -M모듈이 로드되고 해당 네임스페이스의 함수가 포함됩니다 Fatal.pm. open이는 메인 코드에서 파일을 열 때 발생한 모든 오류가 사라짐을 의미합니다.
    • -pSample.txt 파일은 한 줄씩 읽혀지고 모든 변환이 적용된 후 자동 줄 인쇄가 활성화됩니다.
  • BEGIN블록은 기존 file1.log 및 file2.log를 삭제하고 append파일 모드에서 파일 핸들을 열어야 합니다.
  • select명령은 현재 행을 인쇄할 파일 핸들을 선택합니다.
    • $F[0] =~ s/^\D*//r첫 번째 필드에서 숫자가 아닌 선행 문자는 모두 제거되어야 합니다(모든 숫자가 필드 끝에 배치된다고 가정).
    • 세 번째 필드($F[2])에서도 유사한 작업을 수행하고 결과를 문자열 형식(숫자에서 001 = 1이므로 숫자 대신)으로 비교합니다. 문자열이 일치하면 파일 핸들 *FILE1.LOG를 선택합니다. 이는 -p해당 옵션으로 인해 현재 행이 여기에 인쇄된다는 의미입니다. OTW에서는 파일 핸들 *FILE2.LOG가 기본 핸들로 설정되고 -p옵션을 사용하면 Perl현재 행이 거기에 인쇄됩니다.

sed표시된 것과 같은 도구를 사용하여 동일한 작업을 수행 할 수 있습니다 . (GNU sed를 가정)

sed -Ee '
   h;s/\S+/\n&\n/3
   /^[^0-9[:blank:]]*([0-9]+).*\n(.*[^0-9])?\1\n/{
      g
      s/^//w file1.log
      d
   }
   g
' < sample.txt > file2.log

  • 첫 번째 단계에서는 세 번째 필드를 태그로 묶습니다.
  • 그런 다음 첫 번째 필드의 후행 부분에 있는 숫자를 비교하여 세 번째 필드의 후행 부분에 있는 숫자와 일치합니다.
  • 일치하는 경우 현재 줄(토큰 없이)을 저장하는 예약된 공간을 호출하고 이를 file1.log 파일에 추가합니다.
  • 일치하는 항목이 없으면 예약 공간을 호출하여 이를 stdout으로 보내며, 여기서 쉘에 의해 file2.log 파일에 저장됩니다.

답변4

sed편집 스크립트와 함께 GNU를 사용하십시오( sed첫 번째 줄에서 시스템에 맞게 GNU의 경로와 이름을 조정하십시오).

#!/usr/bin/sed -nrf

/^[A-Z]([0-9]+) [0-9]+ [A-Z]\1 [0-9]+$/{
    w match.txt
    b
}
w nonmatch.txt

샘플 파일에서 이 명령을 실행하면 두 개의 결과 파일 match.txt과 다음 이 생성됩니다 nonmatch.txt.

$ chmod +x script.sed

$ ./script.sed file.in

$ cat match.txt
B01 112178282 A01 112178282
B01 114451441 A01 114451441
B01 123453906 A01 123453906
B01 1262441 A01 1262441
B01 471272 A01 471272
B01 17007 A01 17007

$ cat nonmatch.txt
A05 44887670 A01 44887670
B10 8364597 A01 8364597
A05 9155966 A01 9155966
A05 86420950 A01 86420950
A10 75684694 A01 75684694
A04 71261964 A01 71261964
A04 115637044 A01 115637044
A07 9376758 A01 9376758

이 스크립트는 기본적으로 각 줄의 특정 정규식을 일치시키려고 시도합니다. 열 1과 열 3의 두 숫자가 동일하면 표현식이 일치합니다(여기서는 역참조를 사용하여 sedBSD가 이 스크립트를 실행할 수 없습니다).

두 숫자가 동일하면 해당 행이 작성되고 match.txt스크립트는 처음으로 분기되어 다음 입력 행으로 계속됩니다.

행이 정규식과 일치하지 않으면 기록됩니다 nonmatch.txt.

관련 정보