또 다른 awk(ward) 질문 - 여러 키를 사용하여 하위 문자열 매핑

또 다른 awk(ward) 질문 - 여러 키를 사용하여 하위 문자열 매핑

다음과 같은 두 개의 파일이 있습니다.

mapping.txt:

100178  L08/2015
100180  L08/2015
103822  J03/2012
103823  A06/2012
103823  J02/2012
103823  J03/2012
...

input.txt:

100180011|225|
100180011|226|
100181111|201|
100181111|202|
103823004|011|
103823004|012|
...

output.txt입력 파일의 처음 6자리 숫자가 매핑 파일의 하나 이상의 항목과 일치하는 경우 세 번째 열을 매핑 파일의 두 번째 열로 출력하고, 그렇지 않으면 "B00/0000"을 입력합니다.

100180011|225|L08/2015
100180011|226|L08/2015  
100181111|201|B00/0000
100181111|202|B00/0000
103823004|011|A06/2012
103823004|011|J02/2012
103823004|011|J03/2012
103823004|012|A06/2012
103823004|012|J02/2012
103823004|012|J03/2012

이상적으로 이것은 OSX에서 작동해야 하지만 Linux 상자에도 액세스할 수 있습니다.

답변1

가정 bash하고 두 파일이 모두 정렬되어 있다고 가정합니다.

join -a1 <(sed 's/./& /6' input.txt) mapping.txt | sed 's/ //g; s/|$/|B00\/0000/'

산출:

100180011|225|L08/2015
100180011|226|L08/2015
100181111|201|B00/0000
100181111|202|B00/0000
103823004|011|A06/2012
103823004|011|J02/2012
103823004|011|J03/2012
103823004|012|A06/2012
103823004|012|J02/2012
103823004|012|J03/2012

awk볼 수 없습니다. 죄송합니다. :)

편집하다:설명하다:

  • sed 's/./& /6'- 각 줄의 6번째 문자 뒤에 공백을 추가하면 다음과 같이 출력됩니다.100180 011|225|L08/2015
  • join -a1첫 번째 열의 파일을 연결합니다. 첫 번째 파일의 일치하지 않는 행을 변경하지 않고 그대로 두도록 -a1지시합니다 .join
  • sed 's/ //g;'- 결과에서 공백 제거
  • ... 's/|$/|B00\/0000/'- /|B00/0000로 끝나는 줄에 추가됩니다 |. 즉, 첫 번째 파일에서 일치하지 않는 줄에 추가됩니다.

답변2

다음을 시도해 볼 수 있습니다 awk.

awk 'NR == FNR { k = substr($1, 1, 6); x[$1,$2] = k; y[$1,$2] = 0; next; } { for (i in x) { if (x[i] == $1) { split(i, t, SUBSEP); print t[1] "|" t[2] "|" $2; y[i] = 1; } } } END { for (i in y) if (y[i] == 0) { split(i, t, SUBSEP); print t[1] "|" t[2] "|B00/0000" } }' FS="|" input.txt FS=" " mapping.txt

결과는 다음과 같습니다.

100180011|225|L08/2015
100180011|226|L08/2015
103823004|011|A06/2012
103823004|012|A06/2012
103823004|011|J02/2012
103823004|012|J02/2012
103823004|011|J03/2012
103823004|012|J03/2012
100181111|201|B00/0000
100181111|202|B00/0000

관련 정보