현재 줄 옆에 있는 줄의 첫 번째 열을 인쇄하는 방법은 무엇입니까?

현재 줄 옆에 있는 줄의 첫 번째 열을 인쇄하는 방법은 무엇입니까?

다음과 같은 파일이 있습니다.

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

제 생각에는 가장 간단하고 읽기 쉬운 방법은 다음과 같습니다.

  1. 첫 번째 열 추출( cut)
  2. 추출된 열에서 첫 번째 행 제거( tail)
  3. 이 열을 소스 파일( 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

이 솔루션의 구조는 제공된 답변과 다릅니다. 조건부, 루프 또는 정규 표현식이 필요하지 않습니다.

관련 정보