Cat 2 파일 및 중복 라인 방지

Cat 2 파일 및 중복 라인 방지

나는 가지고있다파일 1다음 내용을 포함합니다

{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

나는 가지고있다파일 2다음 내용을 포함합니다

{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"golf4", "value":"18"}

내용을 표시하기 위해 쉘 명령을 실행하고 싶습니다파일 1그리고파일 2. a가 name둘 다에 존재하는 경우파일 1그리고파일 2그래서 관련 행만 표시하고 싶습니다.파일 2.

따라서 출력은 다음과 같아야 합니다.

$command taking account file1 file2
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

이 명령은 편집하면 안 됩니다.파일 1어느 것도 아니다파일 2

명령은 가능한 한 간단해야 합니다.

명령에는 grep, sed,awk

답변1

이는 행의 순서를 유지하지 않지만 필수는 아닙니다.

awk '{line[$1]=$0} END {for (key in line) print line[key]}' file1 file2

답변2

$ awk -F, 'NR==FNR{a[$1]=$0;next};$1 in a {$0=a[$1]}; 1' file2 file1
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

이는 file2다음과 같이 가정합니다.고쳐 쓰다에서 항목을 찾았습니다 file1. 새 항목을 삽입할 수 있는 경우 file2다음과 같이 변경할 수 있습니다.

awk -F, '
  NR==FNR{a[$1]=$0;next}
  $1 in a {$0=a[$1];delete a[$1]}
  1
  END{for (i in a) print a[i]}' file2 file1

주문하다끼워 넣다 표시된 항목이 지정되지 않았습니다. 위의 내용은 항목당 하나의 항목만 있다고 가정합니다.이름모든 파일에.

답변3

순서가 중요하지 않은 경우 다음 명령을 사용하면 됩니다.

cat file2 file1 > files
cut -f2 -d: files | cut -f1 -d, | sort | uniq > pat
for i in $(cat pat); do grep $i files -m 1; done

첫 번째 명령은 입력 파일을 연결합니다(순서가 중요합니다. 해당 값이 file1의 값을 덮어쓰므로 file2가 먼저 실행됩니다).

두 번째 명령은 입력 파일에서 자동차 브랜드를 잘라내고 중복 항목을 정렬 및 제거한 후 pat파일에 저장합니다.

세 번째 명령인 grep은 입력 파일의 각 패턴을 결합하고 첫 번째 일치에서 중지하므로 동일한 자동차 제조업체가 두 파일 모두에 나타나면 file2의 패턴만 인쇄됩니다.

순서가 중요하고 모든 패턴이 file1에 있는 경우 두 번째 명령에서 파일 대신 file1을 사용하고 sortuniq명령을 생략할 수 있습니다.

관련 정보