소스 파일에서 데이터를 복사하기 전에 대상 파일에서 중복된 항목을 확인하세요. [중복]

소스 파일에서 데이터를 복사하기 전에 대상 파일에서 중복된 항목을 확인하세요. [중복]

줄을 복사하려고 합니다.소스파일.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라고 말하세요 .greptarget.txt

아니면 대신 사용할 수도 있습니다 awk.

awk 'NR==FNR{seen[$0]=1;next} !seen[$0]++' target.txt source.txt #>> target.txt
  • 전체 추가타겟.txtseen파일을 전체 행의 키로 호출된 배열에 넣고 다음 행을 읽는 seen[$0]작업을 수행합니다 .next

  • 우리는 !seen[$0]++줄을 찾고 있어요소스파일.txt배열에 존재하지 않으면 인쇄하십시오. 또한 추가됨소스파일.txt중복된 줄이 인쇄되는 것을 방지하기 위해 배열에 줄 파일을 씁니다(source.txt_에 중복된 줄이 있는 경우).

관련 정보