두 파일 모두에 단일 레코드 만있는 경우가 아니라 두 텍스트 파일의 여러 줄에 대해 awk 스크립트를 확장합니다.
Dec 01 2020
이 3 개의 .txt 출력을 생성 할 수 있습니다.
AA;BB;CC;DD;
2 개의 텍스트 파일에서. 두 파일 모두 단일 레코드 만 있습니다.
1 .txt
AA;BB;
2 .txt
CC;DD;BB;AA;
이 awk 스크립트를 사용합니다.
BEGIN{
FS=OFS=";"
}
{
for(i=1;i<=NF;i++){
if(!seen[$i]++){ val=(val?val OFS:"")$i }
}
print val
delete seen
val=""
}
나는 이런 식으로 사용하고 paste
명령을 사용 하여 두 파일을 결합한 다음 awk
명령 으로 출력을 처리합니다 .
paste 1st.txt 2nd.txt | awk -f tst.awk > "3.txt"
하지만 내가 원하는 것은?
하나의 단일 레코드를 더 고려해야합니다. 이 상황에 맞게이 스크립트를 수정하려고합니다. 이제 두 파일에 하나의 레코드 만있는 것이 아니라는 것을 알 수 있습니다.
1 .txt
UU;
AA;BB;
ZZ;KK;
2 .txt
CC;DD;BB;AA;
LL;KK;
GH;ZZ;SS;
생성하려는 출력 3 .txt는 다음과 같습니다.
UU;
AA;BB;CC;DD;
ZZ;KK;LL;GH;SS;
처리 논리 :
위의 코드는 배열 인덱스의 해시 조회에서 리터럴 문자열을 사용하므로 입력에 어떤 문자가 있는지는 신경 쓰지 않습니다.
그러나 샘플 출력에 대한 :의 경우 이 .txt 인 일반 필드에서도있다 (1) 예를 .txt.for BB;AA;
다음 한 행에서 그들을 연결할 필요, 즉 AA;BB;CC;DD
; 주문이 필요하지 않습니다. 예를 들어 출력이 BB;AA;DD;CC;
같은 행의 중복 필드를 피하는 것이 필요한 조건 만 인 경우 관련이 없습니다.
내가 '중복 방지'라고 말하면이 출력을 피하는 것을 의미합니다.
AA;BB;CC;DD;BB;AA;
출력은
AA;BB;CC;DD;
답변
4 User Dec 01 2020 at 15:23
아마도 이것은 당신이 원하는 것입니다.
BEGIN{FS=OFS=";"}
{sub(/;$/,"")} NR==FNR{ for (i=1;i<=NF;++i) for (j=1;j<=NF;++j) if (j!=i&&!b[$i,$j]++) a[$i,++c[$i]]=$j
next
}
{
delete b
for (i=1;i<=NF;++i)
++b[$i] for (i=1;i<=NF;++i) for (j=1;j<=c[$i];++j)
if (!b[a[$i,j]]++) $(NF+1)=a[$i,j]
print
}
다음과 같이 사용하십시오.
awk -f script.awk 2.txt 1.txt
다음은 몇 가지 이전 질문입니다 (아마도 귀하의 질문입니다. 질문을 살펴보고 질문을 올바르게하는 방법에 대해 작업 할 수 있습니다).
- https://superuser.com/q/1600078
- awk : 데이터 생성시 행 순서를 유지하고 중복 문자열 (미러) 제거
- https://superuser.com/q/1600557
- https://superuser.com/q/1601402
- https://superuser.com/q/1602713
- https://stackoverflow.com/q/64929865
- https://superuser.com/q/1604046
- awk의 동적 정규 표현식
- awk 스크립트 실행 후 문자열 잘림