모드 및 파일 처리

모드 및 파일 처리

입력 파일에서 다음 작업을 수행해야 한다고 가정해 보겠습니다.

  • 주어진 패턴으로 시작하는 행에서 n번째 필드를 추출합니다(예: "name" 패턴으로 시작하는 행의 두 번째 필드)

  • 해당하는 각 후속 줄의 시작 부분에 필드 내용을 인쇄합니다.아니요선택한 패턴으로 시작

  • 패턴과 일치하는 새 행이 발견되면 1단계와 2단계를 반복합니다.

저는 현재 이 작업을 위해 Python을 사용하고 있지만 awk와 같은 명령줄에서 가볍고 빠른 명령을 사용하는 것이 더 나을 것입니다.

입력 샘플

name    NAME_A
inf     field_A1
name    NAME_B 
inf field_B1
inf field_B2

예상 출력:

name    NAME_A
NAME_A  inf field_A1
name    NAME_B 
NAME_B  inf field_B1
NAME_B  inf field_B2

답변1

이것은 하나의 접근 방식이 될 수 있습니다. 형식은 지정한 필드 구분 기호에 따라 달라질 수 있습니다. FS필드 구분 기호를 사용하고 정의 할 수 있습니다 OFS.

$ awk -v n=2 '/^name/ {a=$(n); print; next} {print a, $0}' file
name    NAME_A
NAME_A inf  field_A1
name    NAME_B 
NAME_B inf  field_B1
NAME_B inf  field_B2

설명하다

  • -v n=2패턴이 발견되면 복사할 필드 번호를 정의합니다.
  • /^name/ {a=$(n); print; next}줄이 주어진 패턴으로 시작하면 주어진 필드를 저장하고 줄을 인쇄합니다.
  • {print a, $0}그렇지 않으면 먼저 저장된 값을 사용하여 현재 줄을 인쇄합니다.

패턴 부분을 다음과 같이 요약할 수 있습니다.

awk -v n=2 -v pat="name" '$1==pat {a=$(n); print; next} {print a, $0}' file

답변2

sed '/^name  */{h;s///;x;n;};G;s/\(.*\)\n\(.*\)/\2        \1/' <<\DATA
name    NAME_A
inf     field_A1
name    NAME_B 
inf field_B1
inf field_B2
DATA

산출

name    NAME_A
NAME_A  inf     field_A1
name    NAME_B 
NAME_B  inf field_B1
NAME_B  inf field_B2

sed h라오어마다이름그런 다음 동일한 패턴에서 일치하는 패턴을 제거한 다음 인쇄하기 전에 예약된 공간과 패턴 공간을 교환합니다.

다른 모든 줄에서는 G예약된 공간을 패턴 공간에 추가하고 개행 문자를 삽입합니다. 그런 다음 개행 문자의 양쪽을 바꾸고 탭으로 바꿉니다.

답변3

이것은 효과가 있을 수 있습니다:

awk '{print $0 ~ pat ? $0 : p OFS $0   }$0 ~ pat{ p = $NF }' pat='name' file

관련 정보