Tenho arquivos com o seguinte formato: O nome do arquivo é 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
Desejo alterar o nome da terceira coluna da linha como seq1 se o nome na coluna quatro começar com NZ_JAHWGH e seq2 se o nome começar com NZ_CAJGBF. Eu quero uma saída como esta do mesmo arquivo:
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
Eu tentei esses dois comandos, mas eles não funcionaram:
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
Você primeiro
awk
tenta:falha porque
$3==seq1
é um teste para saber se$3
é exatamente igual ao valor da variávelseq1
. O que você queria é,=
em vez disso==
, definir o valor, não testá-lo, e"seq1"
indicar que se trata de uma string e não de uma variável.Em seguida, para verificar uma expressão regular, você precisa de
~ /regex/
, não== /regex/
. Sua segunda tentativa falha pelos mesmos motivos, você precisa"seq1"
ter uma string e não pode usar==
dessa forma. Além disso, como ambosFS
eOFS
o padrão são um espaço, seuBEGIN
bloco não é necessário. Juntando tudo isso, este comando, que é a mesma ideia que você estava tentando, deve funcionar conforme o esperado:Que tal
sed
?