
두 파일을 병합하고 두 번째 파일에서 헤더를 제거해야 합니다. 출력에는 새 시퀀스 번호가 있어야 합니다.
이전 파일 1.txt
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
T00003
파일 2.txt
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
T00003
출력 파일은 다음과 같아야합니다
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
DSEQ0000004USA
DSEQ0000005MEXICO
DSEQ0000006BRAZIL
T00006
awk
파일을 병합하고 헤더를 제거 하곤 했습니다.
awk 'FNR!=NR && FNR==1 {next} 1' file1.txt file2.txt > output.txt
가능하다면 어떻게 시퀀스 번호를 변경하고 awk
동일한 명령에 트레일러 레코드와 전체 D 유형 레코드를 포함할 수 있습니까?
미리 감사드립니다
답변1
다음을 시도해 볼 수 있습니다.
awk 'FNR==1 {if (NR>1) next; print;} \
/^D/ {seq++; sid=sprintf("SEQ%07d",seq); sub(/SEQ[0-9]+/,sid); print} \
END {printf("T%05d\n",seq);}' file1.txt file2.txt
이것은 것이다
- 첫 번째 줄이 "있는 그대로" 인쇄되는 첫 번째 파일을 제외한 모든 파일의 첫 번째 줄을 건너뜁니다.
- 로 시작하는 모든 라인에 대해
D
시퀀스 카운터를 증가시키고seq
기존 시퀀스를 새 시퀀스 ID로 바꾼 다음 라인을 인쇄합니다.
파일 끝에는 마지막 값의 합계가 인쇄됩니다 seq
.
이 솔루션은 2개 이상의 파일에도 적용됩니다.
답변2
기존 입력과 동일한 너비의 0 패딩 문자열로 새 시퀀스 번호를 인쇄하려면 GNU awk를 사용하여 세 번째 인수를 match()로 설정하십시오.
$ cat tst.awk
NR==1 && FNR==1 { print }
FNR > 2 { printf "%s%0*d%s\n", prev[1], length(prev[2]), ++seqNr, prev[3] }
{ match($0,/([^1-9]+)([0-9]+)(.*)/,prev) }
END { printf "%s%0*d\n", prev[1], length(prev[2]), seqNr }
$ awk -f tst.awk file1 file2
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
DSEQ0000004USA
DSEQ0000005MEXICO
DSEQ0000006BRAZIL
T00006
awk의 경우( prev[]
gawk 스크립트와 비교하기 위해 스칼라를 사용하는 대신 배열을 유지하는 경우)는 다음과 같습니다.
$ cat tst.awk
NR==1 && FNR==1 { print }
FNR > 2 { printf "%s%0*d%s\n", prev[1], lgth2, ++seqNr, prev[3] }
{
match($0,/[^1-9]+/)
prev[1] = substr($0,RSTART,RLENGTH)
match($0,/[^1-9]+[0-9]+/)
lgth2 = RLENGTH - length(prev[1])
prev[3] = substr($0,RSTART+RLENGTH)
}
END { printf "%s%0*d\n", prev[1], lgth2, seqNr }
$ awk -f tst.awk file1 file2
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
DSEQ0000004USA
DSEQ0000005MEXICO
DSEQ0000006BRAZIL
T00006
또는 동일한 수의 선행 0을 유지하려면 GNU awk를 사용하십시오.
$ cat tst.awk
NR==1 && FNR==1 { print }
FNR > 2 { print prev[1] (++seqNr) prev[2] }
{ match($0,/([^1-9]+)[0-9]+(.*)/,prev) }
END { print prev[1] seqNr }
$ awk -f tst.awk file1 file2
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
DSEQ0000004USA
DSEQ0000005MEXICO
DSEQ0000006BRAZIL
T00006
그리고 어떤 이상한 :
$ cat tst.awk
NR==1 && FNR==1 { print }
FNR > 2 { print prev[1] (++seqNr) prev[2] }
{
match($0,/[^1-9]+/)
prev[1] = substr($0,RSTART,RLENGTH)
sub(/[^0-9]+[0-9]+/,"")
prev[2] = $0
}
END { print prev[1] seqNr }
$ awk -f tst.awk file1 file2
H20200428
DSEQ0000001USA
DSEQ0000002MEXICO
DSEQ0000003BRAZIL
DSEQ0000004USA
DSEQ0000005MEXICO
DSEQ0000006BRAZIL
T00006