각각 "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()