파일이 두 개 있어요
file1.txt
78Z|033333157|0000001|PERD1|2150421|D|0507020|3333333311
78Z|033333157|0000001|PERD0|2160208|A|1900460|3333333311
78Z|033333157|0000001|RSAB1|2150421|D|0507070|3333333311
78Z|033333157|0000001|RSAB0|2160208|A|1900460|3333333311
78Z|033333157|0000001|ANT37|2141023|D|1245260|3333333311
78Z|033333157|0000001|ANT36|2150422|D|1518490|3333333311
78Z|033333157|0000001|ANT28|2150321|D|0502090|3333333311
78Z|033333157|0000001|ANT27|2150122|D|0501450|3333333311
78Z|033333157|0000001|ANT26|2141222|D|1637460|3333333311
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|033333157|0000001|ABS10|2151221|D|1223390|3333333311
78Z|696931836|0000001|PERD0|2160203|A|1114450|2222222222
78Z|696931836|0000001|RSAB0|2160203|A|1114450|2222222222
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|010041586|0000001|PERD0|2160119|A|1835100|3333333333
78Z|010041586|0000001|RSAB0|2160119|A|1835100|3333333333
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|011512345|0000001|PERD0|2151213|A|1413550|4444444444
78Z|011512345|0000001|RSAB0|2151213|A|1413550|4444444444
78Z|011512345|0000001|ANT32|2160219|A|0319230|4444444444
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|011512345|0000001|ANT07|2150729|D|1508230|4444444444
78Z|011512345|0000001|ANT06|2141013|D|1208190|4444444444
78Z|011512345|0000001|ABB06|2131224|D|1857030|4444444444
78Z|012344052|0000001|PERD0|2160203|A|1219570|5555555555
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
78Z|099999999|0000001|PERD0|2151214|A|1512460|6666666666
78Z|099999999|0000001|RSAB0|2151214|A|1512460|6666666666
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|099999999|0000001|ANT09|2160218|D|0319000|6666666666
78Z|099999999|0000001|ABS10|2150615|D|0125350|6666666666
file2.txt
3333333311|ANT10
2222222222|ANT09
5555555555|ANT50
3333333333|ANT33
6666666666|ANT32
4444444444|ANT09
네 번째와 여덟 번째 열, 두 번째와 첫 번째 열과 file1.txt
일치하는 행이 포함된 새 파일을 만들어야 합니다.file2.txt
결과는 다음과 같아야 합니다(순서는 중요하지 않습니다).
file3.txt
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
답변1
awk -F'|' 'NR==FNR{e[$2$1]=1;next};e[$4$8]' file2.txt file1.txt
첫 번째 독서파일 2e[field2+field1]
그런 다음 배열을 설정하십시오.파일 1e[field4+field8]
설정되었는지 여부를 인쇄합니다 .
또는 필드를 뒤집습니다.
awk -F'|' 'NR==FNR{e[$1$2]=1;next};e[$8$4]' file2.txt file1.txt
답변2
질문에 태그가 지정되었습니다.앗하지만 내 생각에는 당신이 그렇지 않다는 점을 주목할 가치가 있다고 생각합니다.가지다이런 짓을 하곤 했어 awk
. coreutils에는 이런 종류의 작업에 유용한 유틸리티가 있지만 join
데이터에는 약간 번거롭습니다.
귀하의 쉘이 bash 및 GNU coreutils라고 가정합니다. 이는 다른 스타일로 수행할 수 있지만 데이터의 사전/사후 처리가 더 많이 필요할 수 있습니다.
더 이상 번거로움이 없습니다.
join -t"|" -14 -22 -o"$(echo 1.{1..8} 2.1)" \
<(sort -t"|" -k4 file1.txt) \
<(sort -t"|" -k2 file2.txt) \
| grep -Po ".*([\d]+)(?=\|\1$)"
join
-1
두 개의 입력 파일을 허용하고 인수를 통해 전달된 필드에 이를 연결합니다 -2
. -t
입력 파일의 사용자 정의 필드 구분 기호를 나타냅니다. join
입력 파일은 연결되는 필드별로 정렬되어야 하므로 두 입력 파일 모두 에 전달되기 전에 프로세스 대체에서 정렬됩니다 join
. 이 -o
매개변수는 필드를 출력하는 방법을 지정합니다. 기본적으로는 연결된 필드이고, 그 뒤에는 파일 1의 연결되지 않은 필드, 마지막으로 파일 2의 연결되지 않은 필드가 있습니다. 따라서 파일 1의 모든 필드를 순서대로 지정하고 그 뒤에 필드 1이 오도록 지정해야 합니다. 파일 2의
또한 조인이 file1의 필드 8과 file1의 필드 1에 있어야 합니다. 이는 조인 출력 필드 8과 9가 동일한 경우 행을 검색하여 간단히 수행됩니다. 정규식 미리보기를 사용하면 grep -Po
이를 수행하고 필드 9를 효과적으로 제거하여 원하는 출력을 제공할 수 있습니다. 출력은 다음과 같습니다
78Z|696931836|0000001|ANT09|2160203|A|1114450|2222222222
78Z|011512345|0000001|ANT09|2160218|D|0319230|4444444444
78Z|033333157|0000001|ANT10|2160208|A|1900460|3333333311
78Z|099999999|0000001|ANT32|2160219|A|0319000|6666666666
78Z|010041586|0000001|ANT33|2160119|A|1835100|3333333333
78Z|012344052|0000001|ANT50|2160203|A|1219570|5555555555
답변3
더 간단하게, 동일한 첫 번째 필드가 file2에 두 번 제공되는 것이 허용되지 않는다고 가정해 보겠습니다.
awk -F'|' 'FNR == NR { key[$1] = $2; next } $8 in key && key[$8] == $4' file2.txt file1.txt
답변4
노력하다
awk 'BEGIN { FS="|"}
FNR == NR { key[$2 $1]=NR }
FNR > NR { k=$3 $8 ;if (k in key) print ;} ' file2.txt file1.txt
어디
BEGIN { FS="|"}
구분 기호로 사용하도록 aw에게 지시합니다(명령줄에서 사용할 수 있음|
).-F\|
FNR == NR { key[$2 $1]=NR }
파일의 키 기억(file2.txt에 있는 경우)FNR > NR { k=$4 $8 ;if (k in key) print ;}
키가 해시 목록에 있으면 인쇄하세요.
편집: 세 번째 필드를 언급하고 네 번째 필드를 추가했습니다.