줄을 복사하려고 합니다.소스파일.txt도착하다타겟.txt. 이 bash
스크립트를 통해 각 줄을 확인하고 싶습니다 .타겟.txt복사하기 전에 중복된 항목이 있는 경우.
소스파일.txt포함하다:
a$$a$$a b**b** c%%cc%% d##d##d## e^^e^^e^^
타겟.txt포함하다:
a$$a$$a ee$$ee$$ ff__ff__ gg@@gg@@ zzxxzzxx bb..bb..bb e^^e^^e^^ hh;;hh;;hh
이 경우에는 3개의 항목만 복사된다고 가정합니다.타겟.txt 어느 것:
b**b**
c%%cc%%
d##d##d##
내 테스트 코드는 다음과 같습니다
#!/bin/bash
echo "started"
programpath=/home/mysite/www/copyfiles
var str input ; cat "$programpath/source.txt" > $input
var str target ; cat "$programpath/target.txt" > $target
cat $input >> $target
uniq -u "$target"
echo "finished"
exit 1
fi
답변1
왜 사용합니까 bash
? 이 grep
명령은 작업을 깔끔하게 수행합니다.
grep -Fxvf target.txt source.txt #>> target.txt
그러면 다음 위치에 있는 행만 반환됩니다.소스파일.txt, 그런 다음 이 줄을 타겟.txt그냥 주석을 해제하세요 #>> target.txt
.
고유한 것이 필요할 수도 있습니다.소스파일.txt중복된 항목을 추가하는 것을 방지하기 전에소스파일.txt파일을 제출 awk
하고 다음에 동일한 작업을 수행합니다.
grep -Fxvf target.txt <(sort -u source.txt) #>> target.txt
- 이
-F
옵션은grep
일치 패턴을 정규식이 아닌 문자열로 알려줍니다. - 옵션을 사용하면
-x
전체 라인을 내 패턴으로 지정할 수 있습니다. - 이는
-v
역방향 일치이므로, 놓친 경우 두 파일 모두에 있는 줄이 출력됩니다. - 그리고 여기 파일에서 내 스키마를 읽으
-f
라고 말하세요 .grep
target.txt
아니면 대신 사용할 수도 있습니다 awk
.
awk 'NR==FNR{seen[$0]=1;next} !seen[$0]++' target.txt source.txt #>> target.txt
전체 추가타겟.txt
seen
파일을 전체 행의 키로 호출된 배열에 넣고 다음 행을 읽는seen[$0]
작업을 수행합니다 .next
우리는
!seen[$0]++
줄을 찾고 있어요소스파일.txt배열에 존재하지 않으면 인쇄하십시오. 또한 추가됨소스파일.txt중복된 줄이 인쇄되는 것을 방지하기 위해 배열에 줄 파일을 씁니다(source.txt_에 중복된 줄이 있는 경우).