파일의 두 번째 줄에서 두 번째 필드를 첫 번째 줄에 추가합니다.

파일의 두 번째 줄에서 두 번째 필드를 첫 번째 줄에 추가합니다.

예제에 설명된 파일에 다음 파일(예제)을 생성하려면 어떻게 해야 합니까?

상태 줄(예제)의 각 마지막 단어는 이전 줄의 마지막 줄에 추가되어야 합니다.

예제에서는

HDFS  worker01.gtdns.com
state  STARTED
HDFS  worker02.gtdns.com
state  STOP
HDFS  worker03.gtdns.com
state  STARTED
HDFS  worker05.gtdns.com
state  STARTED
HDFS  worker06.gtdns.com
state  STARTED
HDFS  worker07.gtdns.com
state  STARTED
HDFS  worker08.gtdns.com
state  STARTED
HDFS  worker09.gtdns.com
state  STOP

예시(예상결과)

HDFS  worker01.gtdns.com STARTED
HDFS  worker02.gtdns.com STOP
HDFS  worker03.gtdns.com STARTED
HDFS  worker05.gtdns.com STARTED
HDFS  worker06.gtdns.com STARTED
HDFS  worker07.gtdns.com STARTED
HDFS  worker08.gtdns.com STARTED
HDFS  worker09.gtdns.com STOP

답변1

awk '$1 == "HDFS" { printf( "%s ", $0 ) }; $1=="state" { print $2 }' /path/to/input

스크립트 awk는 설명이 매우 간단합니다. 첫 번째 필드가 있는 줄에서 HDFS줄에 공백을 추가하고 후행 줄 바꿈 없이 있는 그대로 인쇄합니다. 첫 번째 필드와 같은 줄에 state두 번째 필드를 인쇄합니다.그리고(암시) 후행 개행 문자.

답변2

짧은GNUAWK방법:

awk -v RS='[[:space:]]+state' '{ printf "%s", $0 }' file
  • -v RS='[[:space:]]+state'- state선행 공백이 있는 하위 문자열을 [[:space:]]+입력 레코드 구분 기호로 처리합니다.RS

산출:

HDFS  worker01.gtdns.com  STARTED
HDFS  worker02.gtdns.com  STOP
HDFS  worker03.gtdns.com  STARTED
HDFS  worker05.gtdns.com  STARTED
HDFS  worker06.gtdns.com  STARTED
HDFS  worker07.gtdns.com  STARTED
HDFS  worker08.gtdns.com  STARTED
HDFS  worker09.gtdns.com  STOP

"2줄" 정적 형식의 경우 - 다음을 시도해 볼 수도 있습니다.SED방법:

sed '/^[[:space:]]*HDFS/{ N; s/[[:space:]]*state // }' file

답변3

사용ex, POSIX 지정 스크립트 가능 파일 편집기:

printf '%s\n' 'g/state/s/^ *state *//|-j' x | ex file.txt

s명령은 표준 대체 명령입니다. -j"이전 줄( )에서 공백으로 구분된 다음 줄을 연결하는 -연결 명령( )을 실행한다 " 는 의미입니다 .j

실제로 join 명령은 연결되는 줄의 선행 공백을 무시하고 s정규식이 제공되지 않으면 이전 정규식이 재사용되므로 다음 명령은 제대로 작동하고 동일한 결과를 제공합니다.

printf '%s\n' 'g/state/s///|-j' x | ex file.txt

이렇게 하면 변경 사항이 파일에 저장됩니다. 변경 사항을 저장하지 않고 보려면 다음 명령을 대신 사용하십시오.

printf '%s\n' 'g/state/s///|-j' %p | ex file.txt

답변4

HDFS 이후에 항상 상태가 있다고 가정하면 문제가 해결됩니다.

awk '$1=="HDFS"{l=$0;next};$1=="state"{print(l,$2);l=""}' file

$1=="HDFS"{ … }행의 경우 필드 1은 HDFSdo 입니다 .
l=$0;nextvar(elle, line)에 저장된 라인을 l다음 라인으로 이동합니다. 필드 1이 수행되는 행
$1=="state"{ … }의 경우 ... var(elle) 및 필드 2에 저장된 행을 인쇄합니다. 오래된(이전) 값을 인쇄하지 마세요.state
{print(l,$2)}l
{l=""}l

관련 정보