입력 파일에서 다음 작업을 수행해야 한다고 가정해 보겠습니다.
주어진 패턴으로 시작하는 행에서 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