특정 "n"(두 번째) 열 값이 있는 행에 대해 파일에서 "m"(첫 번째) 열 값을 추출합니다.

특정 "n"(두 번째) 열 값이 있는 행에 대해 파일에서 "m"(첫 번째) 열 값을 추출합니다.

awk아래 표에 있는 행의 식별 번호만 반환하는 명령을 작성해야 합니다 Turtle. 테이블은 다음 위치에 저장됩니다.turtle.txt

Id Num. Title           CatchDate
433417  RedTurtle       2001-06-29
493303  BlueTurtle      1998-09-20
259497  Turtle          1985-05-08
229505  RedTurtle       1994-07-13
473076  OrangeTurtle    2002-03-08
221907  Blueturtle      1999-07-02
457032  Turtle          1993-04-09
490359  RedTurtle       1996-11-12
494595  SnappingTurtle  1985-05-20
402421  BlueTurtle      1999-08-16

답변1

awk를 사용하세요:

$ awk '$2 == "Turtle" {print $1}' turtle.txt
259497
457032
  • $2선택할 필드입니다.
  • Turtle일치하는 텍스트입니다.
  • {print $1}첫 번째 필드를 인쇄하는 것입니다.
  • turtle.txt소스 파일의 이름입니다.

sed를 사용하세요:

$ <infile sed -E 's/[[:blank:]]+/\n/g;/([^\n]+\n){1}Turtle/([^\n]*).*/\1/;p};d'

설명하다:

  • <infile소스 파일
  • sed -EPOSIX ERE(확장 정규 표현식)와 함께 sed 사용
  • 's/[[:blank:]]+/\n/g+모든 (실행 중인) 탭 공간을 새 줄로 바꿉니다.
  • /([^\n]+\n){1}Turtle\n/필드 n(여기에 사용됨 n-1)가 일치하는 경우 Turtle(정확히 일치).
  • ([^\n]*).*/\1/필드 1 추출(첫 번째 행)
  • p};d'선택 사항을 인쇄하고 어떤 경우든 모든 것을 삭제합니다.

모든 필드 합계 쌍에 대한 일반적인 솔루션 n:m

<infile sed -E 's/[[:blank:]]+/\n/g;/([^\n]+\n){1}Turtle/{s/([^\n]+\n){0}([^\n]*).*/\2/;p};d'
  • <infile소스 파일
  • sed -E 'ERE 정규 표현식을 사용하는 sed의 경우.
  • s/[[:blank:]]+/\n/g모든 입력을 탭이나 공백에서 줄로 나눕니다.
  • /([^\n]+\n){1}Turtle/패턴 공간이 번째 필드와 일치하는 경우 ( 여기서는 ( ) n가 사용됩니다 ).n-1{1}
  • {일련의 명령을 시작합니다.
  • s/교체( s///명령)를 시작합니다.
  • ([^\n]+\n){0}m-1( {0}) 줄을 일치시킵니다 (필드의 경우 m).
  • ([^\n]*)역참조에 남아 있도록 필드(행)를 캡처합니다 \2.
  • .*패턴 공간(원래 줄)의 다른 모든 항목과 일치합니다.
  • /\2/위의 모든 항목(패턴 공간)을 \2.
  • ;p};인쇄해 보세요. 명령 시퀀스를 닫습니다.
  • d어쨌든 패턴 공간을 삭제하고 다시 시작하세요.
  • 'sed 명령을 종료합니다.

답변2

당신은 그것을 사용할 수 있습니다 :

awk '$2 == "Turtle" {print $1}' file
259497
457032

답변3

sed를 사용하세요:

sed -n '/\sTurtle\s/s/^\([0-9]\+\)\s.*/\1/p' file

답변4

골프를 치다:

$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032

또는 Isaac과 Goro의 답변을 얻을 때까지 단계적으로 확장하세요.

awk '$2 == "Turtle" && $0 = $1' <file

awk '$2 == "Turtle" { $0 = $1; print }' <file

awk '$2 == "Turtle" { print $1 }' <file

세 가지 모두 없음정확히숫자가 0이면 숫자를 인쇄하지 않는 내 골프 코드와 동일합니다(의 결과가 $0=$1조건으로 사용됨).


sed위에서 언급한 골프 문제를 보완하는 올바른 솔루션 은 다음과 같습니다 .

$ sed -n '/\<Turtle\>/s/[[:blank:]].*//p' <file
259497
457032

해당 단어가 포함된 모든 줄을 찾은 Turtle다음 인쇄하기 전에 해당 줄의 첫 번째 공백이나 탭과 그 뒤의 모든 항목을 제거합니다(다른 줄의 인쇄는 억제됨 -n).

예를 들어 문자열만 일치 하고 일치하지 않도록 단어 \<\>시작 및 끝 경계를 일치시킵니다 .\<Turtle\>TurtleRedTurtle

관련 정보