교대로 텍스트 붙여넣기

교대로 텍스트 붙여넣기

"main"과 "rename"이라는 두 개의 파일이 있다고 가정합니다. "rename" 파일에는 "main" 파일의 대체 줄에 이름을 추가하는 데 사용되는 여러 줄이 있습니다. ("이름 바꾸기"의 위치 기준)

다른 파일의 줄을 연결하는 데 사용했지만 paste이 상황에 갇혔습니다.

복사 및 붙여넣기를 사용하지 않고 이를 수행할 수 있는 다른 방법이 있습니까? (Ubuntu Linux 18.04에서 쉽게 사용할 수 있는 명령어를 사용하는 것이 좋습니다.)

파일 "마스터"

#
stars
#
twinkle
#
on
#
the
#
sky

파일 "이름 바꾸기"

yellow
white
green
red
blue

원하는 출력

#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

답변1

Awk두 파일을 모두 처리하여 이를 반복하는 동안 한 파일 콘텐츠는 시스템 메모리에, 다른 파일 콘텐츠는 시스템 메모리에 유지함으로써 이를 사용할 수 있습니다 .

awk 'FNR==NR{ words[NR]=$0; next}{ if ($0 ~ /^#/) $0 = $0 words[++idx];  print }' rename main

작동 원리에 대한 간략한 설명

  • 이 섹션은 배열의 파일 내용을 인덱싱하여 FNR==NR{ words[NR]=$0; next}첫 번째 파일에 대해 작동합니다 . 현재 줄 번호를 추적하는 데 사용되는 특수 변수입니다. 그래서 배열은 다음과 같습니다renamewordsNRAwkwords['1']="yellow", words['2']="white"
  • {..}현재 부분은 다음 파일에 적용되며 rename행이 일치하면 생성된 배열의 요소를 추가하여 현재 행을 업데이트합니다 #.$0
  • 이 명령으로 시작하는 줄의 경우 print명령은 문자열이 추가된 줄을 인쇄 #하고 다른 줄은 그대로 인쇄합니다.

답변2

전화 한 번 이면 paste쉽게 끝낼 수 있어요

<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-d에 전달된 구분 기호 목록에 두 개 이상의 구분 기호가 사용된 경우 paste이러한 구분 기호는 모두 사용될 때까지 계속 사용된 후 다시 시작됩니다. 위 명령에서 전달된 두 개의 구분 기호는 \0(빈 문자열)과 \n(개행)입니다. 표준 입력은 파일을 가리키고 main파일은 두 개의 ' 를 통해 명령에서 두 번 참조되며 -, 모두 다음과 같은 출력 라인이 생성됩니다.

  1. main에서 줄을 타고 및
  2. 빈 문자열 추가
  3. 다음 행을 가져와 rename위에 추가하세요.
  4. 그런 다음 위에 개행 문자를 추가하세요.
  5. 한 줄을 추가하여 루프를 완성하세요 main

등.

답변3

사용방법은 이렇습니다반죽. 관심 있는 줄이 평행하게 실행되도록 두 번째 파일의 줄 간격을 두 배로 늘리는 것부터 시작합니다. 둘째, 기본적으로 공백으로 표시되지 않는 \0 또는 NUL 값을 사용하여 줄을 함께 붙여넣습니다. 출력 공간을 두 배로 늘리는 데 사용할 수 있는 다양한 방법이 있지만 붙여넣기가 편리합니다(예:sed언급했듯이 *다른 사람들은 참조하세요출력 스트림에서 줄 바꿈을 두 배로 늘리는 방법).

이중 간격으로 정렬할 수 있음을 보여주는 두 개의 원본 파일이 표시됩니다. 기본 구분 기호를 사용하여 두 파일을 붙여넣으면 정렬이 표시됩니다. 실제 대답은 두 가지 방법입니다. 하나는 임시 파일을 사용하는 표준 방법이고 두 번째는 프로세스 교체를 사용하는 것입니다.

다음은 스크립트 조각입니다.

FILE1=${1-data1}
shift
FILE2=${1-data2}
E="expected-output"

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input $FILE1 and $FILE2, columnized to save visual space:"
paste $FILE1 $FILE2 | expand -30

pl " Expected output:"
cat $E

rm -f t0
pl " Results, paste with double-space $FILE2, default options:"
# sed '/^$/d;G' $FILE2 > t0
paste -d '\n' - /dev/null < $FILE2 > t0
paste $FILE1 t0

pl " Results with paste of NUL, \0:"
paste -d'\0' $FILE1 t0

pl " Results with paste, process substitution:"
paste -d'\0' $FILE1 <( sed '/^$/d;G' $FILE2 )

생산:

 Input data1 and data2, columnized to save visual space:
#                             yellow
stars                         white
#                             green
twinkle                       red
#                             blue
on                            
#                             
the                           
#                             
sky                           

-----
 Expected output:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results, paste with double-space data2, default options:
#       yellow
stars
#       white
twinkle
#       green
on
#       red
the
#       blue
sky

-----
 Results with paste of NUL, \0:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results with paste, process substitution:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

이는 다음과 같은 시스템에서 수행되었습니다.

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23

건배, drl

관련 정보