awk를 사용하여 열을 병합하시겠습니까? (또는 다른 제안)

awk를 사용하여 열을 병합하시겠습니까? (또는 다른 제안)

보다 효율적으로 작업하려고 노력 중이며 스크립트나 명령 솔루션이 필요합니다.

2개의 열이 있는 하나의 파일 또는 1개의 열이 있는 두 개의 파일 중 더 쉬운 것을 생성한다고 가정합니다.

AA1 B2        ZZ1 YYY XX1
AA2 B2        ZZ2 YYY XX2
AA3 B3        ZZ3 YYY XX3
AA4 B4        ZZ4 YYY XX4
              ZZ5 YYY XX5
              ZZ6 YYY XX6
              ZZ7 YYY XX7

항목 수가 고르지 않습니다. 이제 첫 번째 열의 각 값을 가져와서 두 번째 열의 각 값과 결합하는 새 파일(바람직하게는 다른 입력도 포함하지만 여기서부터 시작하겠습니다)을 만들고 싶습니다. 행) ) 출력 결과는 다음과 같습니다.

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
[...]
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2

따라서 1열의 모든 값을 순서대로 반복하고 2열의 각 값과 순서대로 결합합니다.

답변1

다음과 같은 파일이 있다고 가정해 보겠습니다.

$ cat file1
ZZ1 YYY XX1
ZZ2 YYY XX2
ZZ3 YYY XX3
ZZ4 YYY XX4
ZZ5 YYY XX5
ZZ6 YYY XX6
ZZ7 YYY XX7
$ cat file2
AA1 B2
AA2 B2
AA3 B3
AA4 B4

그런 다음 이것을 사용하십시오 awk:

awk 'FNR==NR{a[c++]=$0} FNR!=NR{for(i in a){print $0,a[i]}}' file1 file2
  • FNR==NR첫 번째 파일에서만 작동합니다.file1
    • a[c++]=$0a내용으로 이름이 지정된 배열을 채웁니다.file1
  • FNR!=NR두 번째 파일에서만 작동합니다.file2
    • for(i in a)배열을 반복하는 중 a...
    • print $0,a[i]file2...그리고 배열의 행과 내용을 인쇄합니다.

산출:

AA1 B2 ZZ1 YYY XX1
AA1 B2 ZZ2 YYY XX2
AA1 B2 ZZ3 YYY XX3
AA1 B2 ZZ4 YYY XX4
AA1 B2 ZZ5 YYY XX5
AA1 B2 ZZ6 YYY XX6
AA1 B2 ZZ7 YYY XX7
AA2 B2 ZZ1 YYY XX1
AA2 B2 ZZ2 YYY XX2
AA2 B2 ZZ3 YYY XX3
AA2 B2 ZZ4 YYY XX4
AA2 B2 ZZ5 YYY XX5
AA2 B2 ZZ6 YYY XX6
AA2 B2 ZZ7 YYY XX7
AA3 B3 ZZ1 YYY XX1
AA3 B3 ZZ2 YYY XX2
AA3 B3 ZZ3 YYY XX3
AA3 B3 ZZ4 YYY XX4
AA3 B3 ZZ5 YYY XX5
AA3 B3 ZZ6 YYY XX6
AA3 B3 ZZ7 YYY XX7
AA4 B4 ZZ1 YYY XX1
AA4 B4 ZZ2 YYY XX2
AA4 B4 ZZ3 YYY XX3
AA4 B4 ZZ4 YYY XX4
AA4 B4 ZZ5 YYY XX5
AA4 B4 ZZ6 YYY XX6
AA4 B4 ZZ7 YYY XX7

답변2

값에 공백이 있으므로 두 열을 별도의 파일에 넣는 것이 더 쉬울 것입니다. 그러면 다음과 같이 할 수 있습니다:

IFS='
'
for a in $(cat file1); do
  for b in $(cat file2); do
     echo "$a $b" > file3;
  done
done

file2의 모든 줄을 완전히 읽어야 하기 때문에 가장 효율적이지는 않지만 작업은 완료됩니다.

관련 정보