![파일의 두 번째 줄에서 두 번째 필드를 첫 번째 줄에 추가합니다.](https://linux55.com/image/125191/%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%EC%A4%84%EC%97%90%EC%84%9C%20%EB%91%90%20%EB%B2%88%EC%A7%B8%20%ED%95%84%EB%93%9C%EB%A5%BC%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%A4%84%EC%97%90%20%EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4..png)
예제에 설명된 파일에 다음 파일(예제)을 생성하려면 어떻게 해야 합니까?
상태 줄(예제)의 각 마지막 단어는 이전 줄의 마지막 줄에 추가되어야 합니다.
예제에서는
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
실제로 j
oin 명령은 연결되는 줄의 선행 공백을 무시하고 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은 HDFS
do 입니다 …
.
l=$0;next
var(elle, line)에 저장된 라인을 l
다음 라인으로 이동합니다. 필드 1이 수행되는 행
$1=="state"{ … }
의 경우 ... var(elle) 및 필드 2에 저장된 행을 인쇄합니다. 오래된(이전) 값을 인쇄하지 마세요.state
{print(l,$2)}
l
{l=""}
l