다음과 같은 파일이 있습니다.
abc 123
abc 789
bcd 456
acb 135
다음 행의 첫 번째 열을 현재 행에 인쇄하고 싶습니다.
원하는 출력:
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
나는 awk를 사용하는 것을 선호합니다.
답변1
이전 줄을 기억하세요.
awk 'NR > 1 { print prev, $1 } { prev = $0 } END { print prev }'
이는 입력을 다음과 같이 처리합니다.
- 현재 줄이 두 번째 줄 이상인 경우 이전 줄( 에 저장됨
prev
, 다음 단계 참조)과 현재 줄의 첫 번째 필드를 출력 필드 구분 기호로 구분하여 인쇄합니다(기본값은 공백 문자입니다). - 모든 경우에 현재 행을
prev
변수에 저장합니다. - 파일 끝에서 이전 줄을 인쇄합니다.
답변2
대체 awk
방법:
$ awk 'NR == 1{printf "%s", $0;next}{printf " %s\n%s", $1,$0}' input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
작동 방식은 간단합니다. 첫 번째 줄은 특별한 경우입니다. 줄 바꿈 없이 인쇄하고 awk에게 다른 코드 블록을 실행하지 않고 다음 줄로 이동하라고 지시합니다. 그 이후에는 NR == 1{printf "%s", $0;next}
건너뛰지만 다른 부분이 해당 작업을 수행합니다.
지금까지 우리는 개행 없이 형식화된 문자열을 인쇄했다는 것을 기억하십시오. 따라서 지금 하고 싶은 일은 printf " %s\n%s",$1,$0
첫 번째 단어를 인쇄하고(새 줄이 없기 때문에 동일한 출력 줄에 유지됨) 새 줄을 삽입한 다음 전체 줄 자체를 삽입하는 것입니다(그러나 줄 바꿈으로 끝나지는 않습니다). . 따라서 삽입된 다음 첫 번째 단어는 같은 줄에 유지됩니다. 파일 끝에 도달할 때까지 프로세스가 계속됩니다.
가능한 개선점은 END{print ""}
최종 개행 문자를 삽입하는 블록을 포함하는 것입니다. 어떤 경우에는 결과 파일이 다른 스크립트에 의해 처리되는데, 이는 바람직할 수 있습니다.
사용자가 특별히 AWK를 요청했지만 형식이 지정된 문자열을 인쇄하는 동일한 접근 방식을 Python과 같은 다른 언어에서도 사용할 수 있습니다. 다른 언어로 이를 달성하는 방법이 궁금한 사람들을 위해 Python 대안이 제공됩니다.
#!/usr/bin/env python
from __future__ import print_function
import sys
old = None
for index,line in enumerate(sys.stdin):
if index == 0:
print(line.strip(),end=" ")
continue
words = line.strip().split()
print(words[0] + "\n" + line.strip(),end=" ")
사용법은 다음과 같습니다:
$ ./append_first.py < input.txt
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
마지막 줄 바꿈에 대한 동일한 아이디어가 여기에 적용됩니다.
답변3
sed
이건 단지 재미를 위한 추악한 방법이에요
sed '2,$ s/[^ ]\+/& &/; 2,$ s/ /\n/' file | paste -d ' ' - -
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
설명하다
2,$
두 번째 줄부터 마지막 줄까지s/[^ ]\+/& &/
공백이 아닌 문자의 첫 번째 세트를 두 배로 늘립니다.;
셸에서와 마찬가지로 별도의 명령s/ /\n/
첫 번째 공백을 개행 문자로 바꾸기paste -d ' ' - -
엉망진창을 서로 붙입니다(2행을 3행에 추가하고, 4행을 3행에 추가하는 등).
답변4
제 생각에는 가장 간단하고 읽기 쉬운 방법은 다음과 같습니다.
- 첫 번째 열 추출(
cut
) - 추출된 열에서 첫 번째 행 제거(
tail
) - 이 열을 소스 파일(
paste
) 에 붙여넣으세요.
예: 샘플 입력 파일:
abc 123
abc 789
bcd 456
acb 135
그런 다음 터미널에서 다음 명령을 실행하십시오.
cut -d' ' -f1 in.txt | tail -n +2 | paste -d' ' file -
산출:
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
이 솔루션의 구조는 제공된 답변과 다릅니다. 조건부, 루프 또는 정규 표현식이 필요하지 않습니다.