한 파일의 열 데이터를 다른 파일의 행 데이터로 바꾸기

한 파일의 열 데이터를 다른 파일의 행 데이터로 바꾸기

저는 Linux 환경이 처음이고 일부 데이터를 처리하기 위한 스크립트를 작성해야 합니다.

다음과 같은 파일이 있습니다.

파일 A:

1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0

또 다른 파일은 다음과 같습니다.

파일 B:

1 0.5
2 0.3
3 0.2

파일 A의 4열에 있는 숫자를 파일 B의 2열에 있는 숫자로 바꿔야 하지만, 파일 A의 3열에 있는 숫자와 파일 B의 1열에 있는 숫자가 일치해야 합니다.

원하는 출력은 다음과 같습니다.

1    X   1    0.5
2    X   1    0.5
3    X   1    0.5
4    Y   2    0.3
5    Y   2    0.3
6    Z   3    0.2

답변1

파일을 정렬할 수 없다면 join구분된 데이터를 처리하도록 설계된 Awk를 사용하세요.

이 경우 두 번째 파일이 먼저 전달되고 조회 테이블이 작성된 다음 첫 번째 파일이 전달될 때 조회 테이블을 사용하여 첫 번째 파일의 각 줄을 수정합니다.

$ cat file2
1 0.5
2 0.3
3 0.2
$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ awk 'NR==FNR {a[$1] = $2; next} {$4 = a[$3]} 1' file2 file1
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$

답변2

사용 join:

join -1 3 -o 1.1,1.2,0,2.2 file1 file2

제공된 파일 출력을 사용하십시오.

$ cat file1
1    X   1    1.0
2    X   1    1.0
3    X   1    1.0
4    Y   2    1.0
5    Y   2    1.0
6    Z   3    1.0
$ cat file2
1 0.5
2 0.3
3 0.2
$ join -1 3 -o 1.1,1.2,0,2.2 file1 file2
1 X 1 0.5
2 X 1 0.5
3 X 1 0.5
4 Y 2 0.3
5 Y 2 0.3
6 Z 3 0.2
$ 

두 입력 파일 모두 정렬해야 합니다(결합하려는 열 기준). 그건사전 편집sort -n숫자가 아닌 정렬이 필요하므로 항목이 10개 이상인 경우 파일을 적절하게 정렬해야 합니다. (리조트 가입 후 재방문 가능합니다.)

답변3

입력을 정렬할 수 없으면 join작동하지 않지만 사용할 수는 있습니다 sed. 아이디어는 sed한 번 사용하여 fileB를 스크립트로 변환한 다음 해당 스크립트를 다시 공급하여 sedfileA를 변환하는 것입니다.

따라서 한 줄에 표준 POSIX 쉘 명령 대체를 사용하십시오.

sed -e "$(sed 's:^\([0-9]*\) \(.*\)$:s/\1  *[^ ]*$/\1    \2/:' file2)" file1

관련 정보