![교대로 텍스트 붙여넣기](https://linux55.com/image/159809/%EA%B5%90%EB%8C%80%EB%A1%9C%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EB%B6%99%EC%97%AC%EB%84%A3%EA%B8%B0.png)
"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}
첫 번째 파일에 대해 작동합니다 . 현재 줄 번호를 추적하는 데 사용되는 특수 변수입니다. 그래서 배열은 다음과 같습니다rename
words
NR
Awk
words['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
파일은 두 개의 ' 를 통해 명령에서 두 번 참조되며 -
, 모두 다음과 같은 출력 라인이 생성됩니다.
main
에서 줄을 타고 및- 빈 문자열 추가
- 다음 행을 가져와
rename
위에 추가하세요. - 그런 다음 위에 개행 문자를 추가하세요.
- 한 줄을 추가하여 루프를 완성하세요
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