저는 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 -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를 스크립트로 변환한 다음 해당 스크립트를 다시 공급하여 sed
fileA를 변환하는 것입니다.
따라서 한 줄에 표준 POSIX 쉘 명령 대체를 사용하십시오.
sed -e "$(sed 's:^\([0-9]*\) \(.*\)$:s/\1 *[^ ]*$/\1 \2/:' file2)" file1