AWK를 사용하여 첫 번째 파일을 반복하고 두 번째 파일의 모든 줄 옆에 첫 번째 파일의 각 줄을 인쇄하려면 어떻게 해야 합니까?

AWK를 사용하여 첫 번째 파일을 반복하고 두 번째 파일의 모든 줄 옆에 첫 번째 파일의 각 줄을 인쇄하려면 어떻게 해야 합니까?

다음은 제가 달성하고 싶은 것의 예입니다.

파일 1:

Adam
John
Tim

파일 2:

,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801

산출:

Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801

감사해요!

답변1

$ awk 'NR == FNR { names[$1]; next }
                 { for (name in names) printf("%s%s\n", name, $0) }' file1 file2
Adam,2018-2-1301
Tim,2018-2-1301
John,2018-2-1301
Adam,2018-3-1379
Tim,2018-3-1379
John,2018-3-1379
Adam,2018-1-3809
Tim,2018-1-3809
John,2018-1-3809
Adam,2018-2-5801
Tim,2018-2-5801
John,2018-2-5801

awk이는 첫 번째 파일(이름이 3개 있는 파일)을 연관 배열(키로)로 읽는 데 사용됩니다 . 두 번째 파일을 읽으면 두 번째 파일의 각 줄이 이전에 읽은 각 이름과 함께 반복적으로 출력됩니다.

NR == FNR첫 번째 파일에서 읽으면 테스트는 참입니다. 현재 파일의 레코드 번호에 대해 총 레코드 번호("줄 번호")를 테스트합니다.


당신은 또한 하나를 만들 수 있습니다교차 연결GNU처럼 join:

$ join -j 99 -o1.1,2.1 file[12]
Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801

... 99두 파일 모두에 존재하지 않는 필드는 어디에 있습니까?

이 예에서는 결과를 파이핑하여 삽입된 공백을 제거할 수 있습니다 tr -d ' '.

답변2

이건 어때?

$ cat names 
Adam
John
Tim

$ cat dates
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801


$ while read name; do 
    while read date; do   
      n=`echo "$name" | awk '{print $1};'`
      d=`echo "$date" | awk '{print $1};'`
      echo "$n $d"
    done < dates
  done < names


Adam ,2018-2-1301
Adam ,2018-3-1379
Adam ,2018-1-3809
Adam ,2018-2-5801
John ,2018-2-1301
John ,2018-3-1379
John ,2018-1-3809
John ,2018-2-5801
Tim ,2018-2-1301
Tim ,2018-3-1379
Tim ,2018-1-3809
Tim ,2018-2-5801

답변3

다음과 같이 시도해 볼 수 있습니다.

awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1

관련 정보