한 파일의 패턴과 일치하는 행을 가져와서 동일한 패턴과 일치하는 두 번째 파일에 넣습니다.

한 파일의 패턴과 일치하는 행을 가져와서 동일한 패턴과 일치하는 두 번째 파일에 넣습니다.

각각 "b" 문자로 시작하는 줄이 포함된 2개의 파일이 있고 첫 번째 파일에 나타나는 순서대로 줄을 병합하고 싶다고 가정해 보겠습니다.

첫 번째 파일(1.txt)

b 12 32
b 23 43
b 23 63

두 번째 파일(2.txt)

a 1322
c 233
g 23324
s 24352

b
h vd2 3f4g

a 2t42
c 34536
g h3443e
s 24h455

b
h 3434gggdfbv4

a 423gwg
c f24bv
g 34g 45h
s 4zth5

b
h 3456zh543

두 번째 파일에서 "b" 문자로 시작하는 줄에는 더 이상 정보가 포함되지 않는 반면, 첫 번째 파일에서는 내 줄이 "b"로 시작하고 그 뒤에 정수 값이 오는 것을 볼 수 있습니다.

지금 필요한 것은 첫 번째 파일에서 정수를 가져와 첫 번째 파일에 나타나는 것처럼 "b" 줄의 두 번째 파일에 넣는 것입니다. 따라서 두 번째 파일은 다음과 같이 표시되어야 합니다.

병합 파일(3.txt)

a 1322  
c 233  
g 23324  
s 24352  

b 12 32  
h vd2 3f4g  

a 2t42  
c 34536  
g h3443e  
s 24h455  

b 23 43  
h 3434gggdfbv4  

a 423gwg  
c f24bv  
g 34g 45h  
s 4zth5  

b 23 63  
h 3456zh543  

가입하다이 명령은 내가 원하는 것을 수행할 수 있는 것 같지만 선행 "b" 문자와 일치하는 줄에서만 작동하도록 지시하는 방법을 찾을 수 없습니다. 또한 파일 1을 반복하여 "^b" 패턴과 일치하는 줄 번호를 얻은 다음 이를 사용하여 "^b" 패턴과 일치하는 파일 2의 줄을 바꾸는 것을 고려했지만 다시 작동하는 솔루션을 찾을 수 없습니다. . 내 작업을 수행하기 위한 짧은 bash 스크립트를 아는 사람이 있나요?

답변1

GNU sed 사용:

sed -e '/^b/{R 1.txt' -e 'd}' 2.txt

2.txt파일을 "제자리"에서 편집 하려면 sed옵션을 추가하세요 -i.

답변2

그리고 awk:

awk 'NR==FNR{a[++i]=$0;next}$0=="b"{$0=a[++j]}1' file1 file2

먼저, file1의 내용으로 배열을 채우고 a, file2가 처리되면 문자 "b"만 포함된 줄 대신 배열이 인쇄됩니다.

답변3

Perl을 사용하면 더 쉬울 수도 있지만 아직 Perl을 배운 적이 없습니다.

awk이를 위해 몇 가지 트릭을 사용할 수 있습니다.

awk 'NR == FNR { line[NR] = $0; next } /^b/ { $0 = line[++whichline] } 1' 1.txt 2.txt > 3.txt

그러면 첫 번째 파일의 모든 행이 명명된 배열에 저장되고 line해당 행이 두 번째 파일의 일치하는 행에 배치됩니다 /^b/.

답변4

Python이 여기에 도움이 될 수 있습니다.

    #!/bin/env python
    fileA=open('filea','r')
    fileB=open('fileb','r')
    resultFile = open('resultfile','w')
    linesA=fileA.readlines()
    i=0
    for line in fileB:
      if line.lstrip().startswith('b'):
        resultFile.write(linesA[i].rstrip())
        i=i+1
      else:
        resultFile.write(line)
   fileA.close()
   fileB.close()
   resultFile.close()

관련 정보