다음과 같은 두 개의 파일이 있습니다.
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