두 파일 모두에 단일 레코드 만있는 경우가 아니라 두 텍스트 파일의 여러 줄에 대해 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 스크립트 실행 후 문자열 잘림