두 파일의 첫 번째 열을 가져와 세 번째 파일에 씁니다.

두 파일의 첫 번째 열을 가져와 세 번째 파일에 씁니다.

2개의 파일이 있고 예를 ABC.txt들어 PQR.txt아래와 같은 데이터가 있다고 가정해 보겠습니다.

ABC.txt:

ABC DEF

PQR.txt:

PQR XYZ

grep두 파일 중 열 1을 세 번째 텍스트 파일에 쓰고 싶습니다 . 어떻게 하나요?

내 예상 출력은 (output.txt)입니다.

ABC PQR

답변1

이를 수행하는 방법에는 여러 가지가 있습니다.

  • 사용 pastecut:

    $ paste -d ' ' <(cut -d' ' -f 1 ABC.txt ) <(cut -d' ' -f 1 PQR.txt ) > output.txt
    ABC PQR
    

    시스템이 프로세스 대체를 지원하지 않는 경우 다음 명령을 사용하십시오.

    $ cut -d' ' -f 1 ABC.txt > /tmp/aa; cut -d' ' -f 1 PQR.txt > /tmp/bb; paste -d ' ' /tmp/aa /tmp/bb
    
  • 사용하세요 awk(@Costas 덕분에):

    awk 'FNR==NR{a[FNR]=$1; next}{print a[FNR],$1}' ABC.txt PQR.txt > output.txt
    

    특수 변수는 FNR현재 입력 파일의 줄 번호와 NR파일의 출처에 관계없이 일반적으로 입력의 줄 번호입니다. 이 둘은 첫 번째 입력 파일을 읽을 때만 동일합니다. 따라서 첫 번째 파일의 첫 번째 필드는 배열 a( a[FNR]=$1)에 저장됩니다. 배열의 키는 줄 번호이고 값은 첫 번째 필드입니다. 그런 다음 두 번째 파일에 도달하면 a[NR]해당 줄 번호( )와 현재 줄의 첫 번째 필드에 해당하는 값을 인쇄합니다.

답변2

nl다음을 사용하여 행 수를 계산할 수 있습니다 .join

join -o 1.2,2.2 <(nl ABC.txt) <(nl PQR.txt) > OUT.file

또는 통해cat -n

join -o 1.2,2.2 <(cat -n ABC.txt) <(cat -n PQR.txt) > OUT.file

좋다for/while 루프에 입력된 두 파일을 구문 분석합니다.그냥 사용할 수 있습니다bash builtins

while read -u 3 a b && read -u 4 c d
do
  echo "$a $c"
done 3< ABC.txt 4< PQR.txt >OUT.txt

답변3

입력 파일의 필드가 공백으로 구분되어 있다고 가정하면 다음과 같이 작성합니다.

paste -d " " ABC.txt PQR.txt | cut -d " " -f 1,3 > Output.txt

쉘이 bash/ksh/zsh(?)라고 가정하고 임의의 공백과 파일당 2개 이상의 열을 처리합니다.

paste -d " " <(awk '{print $1}' ABC.txt) <(awk '{print $1}' PQR.txt) > Output.txt

관련 정보