텍스트 파일의 두 번째 열 일치를 기준으로 열 이름 바꾸기

텍스트 파일의 두 번째 열 일치를 기준으로 열 이름 바꾸기

다음 형식의 파일이 있습니다. 파일 이름은 file.txt입니다.

chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq3 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq5 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq6 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq7 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq8 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq9 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq50 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq51 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq52 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq54 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq55 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq56 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq57 NZ_CAJGBF010000024.1 0 49535 green_a4

네 번째 열의 이름이 NZ_JAHWGH로 시작하면 행의 세 번째 열에 있는 이름을 seq1로 변경하고, 이름이 NZ_CAJGBF로 시작하면 seq2로 변경하고 싶습니다. 동일한 파일에서 다음과 같은 출력을 얻고 싶습니다.

chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq1 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq1 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq1 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq1 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq1 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq1 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq2 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq2 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq2 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq2 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq2 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq2 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq2 NZ_CAJGBF010000024.1 0 49535 green_a4

다음 두 명령을 시도했지만 작동하지 않습니다.

awk 'BEGIN{FS=OFS=" "}($4 == /^NZ_JAHWGH/){$3==seq1}1' file.txt

awk 'BEGIN{FS=OFS=" "} {if ($4 ~ /^NZ_JAHWGH/) $3=seq1}1' file.txt

답변1

먼저 awk시도해 보세요:

awk 'BEGIN{FS=OFS=" "}($4 == /^NZ_JAHWGH/){$3==seq1}1' file.txt

$3==seq1테스트가 $3정확히 다음과 같기 때문에 실패합니다 .바꾸다 seq1. 당신이 원하는 것은 값을 테스트하는 대신 값을 설정하고 이것이 변수가 아니라 문자열임을 나타내는 것이 =아닙니다 .=="seq1"

다음으로 정규식을 확인하려면 ~ /regex/대신 가 필요합니다 == /regex/. 같은 이유로 두 번째 시도가 실패했습니다. "seq1"문자열이 필요하지만 ==이 방법으로는 사용할 수 없습니다. 또한 및 둘 다 FS기본적 OFS으로 공백이므로 BEGIN블록이 필요하지 않습니다. 이 모든 것을 종합하면 다음 명령(시도하는 것과 동일한 아이디어)이 예상대로 작동해야 합니다.

$ awk '($4 ~ /^NZ_JAHWGH/){$3="seq1"} ($4 ~ /^NZ_CAJGBF/){$3="seq2"}1' file.txt
chr - seq1 NZ_JAHWGH010000010.1 0 60562 green_a4
chr - seq1 NZ_JAHWGH010000012.1 0 466573 green_a4
chr - seq1 NZ_JAHWGH010000013.1 0 125526 green_a4
chr - seq1 NZ_JAHWGH010000014.1 0 717625 green_a4
chr - seq1 NZ_JAHWGH010000015.1 0 209757 green_a4
chr - seq1 NZ_JAHWGH010000016.1 0 55318 green_a4
chr - seq1 NZ_JAHWGH010000017.1 0 467034 green_a4
chr - seq2 NZ_CAJGBF010000017.1 0 83173 green_a4
chr - seq2 NZ_CAJGBF010000018.1 0 76510 green_a4
chr - seq2 NZ_CAJGBF010000019.1 0 67820 green_a4
chr - seq2 NZ_CAJGBF010000021.1 0 61770 green_a4
chr - seq2 NZ_CAJGBF010000022.1 0 56876 green_a4
chr - seq2 NZ_CAJGBF010000023.1 0 50411 green_a4
chr - seq2 NZ_CAJGBF010000024.1 0 49535 green_a4

답변2

어때요 sed?

sed -e "s/seq.* NZ_JAHWGH/seq1 NZ_JAHWGH/" -e "s/seq.* NZ_CAJGBF/seq2 NZ_CAJGBF/" file.txt

관련 정보