Tenho muitos arquivos TSV grandes com 6 colunas sem nome e cerca de 10 milhões de linhas. Preciso aplicar uma alteração linha por linha e salvar como um novo TSV. Estou trabalhando no Linux e tenho acesso ao awk, gawk, grep. Idealmente, o código faria referência aos números das colunas em seus operadores para que funcionasse independentemente do conteúdo da linha. TIA!
As únicas alterações que precisam ser feitas são nas Colunas 2 e 3, mas a alteração está condicionada ao valor na Coluna 6:
If the value of column 6 is "+", then:
New Column 2: [Column 2 Value]
New Column 3: [Column 2 Value] + 1
If the value of column 6 is "-", then:
New Column 2: [Column 3 Value] - 1
New Column 3: [Column 3 Value]
Exemplo de estrutura de dados TSV (não | presente nos dados reais)
| AI | 828 | 878 | ABC4807:78485:5:79215 | 42 | - |
| AI | 971 | 1021 | ABC248:78485:5:79215:46065 | 42 | + |
| AI | 1104 | 1153 | X7481:78485:5:79215:40174 | 35 | - |
| XVDIII | 56939 | 56988 | 9478:78485:5:79215:30872 | 42 | - |
| XVDIII | 56971 | 57020 | 7841S:78485:5:79215:34301 | 42 | - |
| UTXV | 1043196 | 1043246 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV | 1043198 | 1043248 | C74581:78485:5:79215:10792 | 42 | - |
| UTXV | 1043201 | 1043250 | T75S17:78485:5:79215:30204 | 42 | - |
| UTXV | 1043201 | 1043251 | B784W7:78485:5:79215:42548 | 42 | - |
Saída TSV desejada
| AI | 877 | 878 | ABC4807:78485:5:79215 | 42 | - |
| AI | 971 | 972 | ABC248:78485:5:79215:46065 | 42 | + |
| AI | 1152 | 1153 | X7481:78485:5:79215:40174 | 35 | - |
| XVDIII | 56987 | 56988 | 9478:78485:5:79215:30872 | 42 | - |
| XVDIII | 57019 | 57020 | 7841S:78485:5:79215:34301 | 42 | - |
| UTXV | 1043196 | 1043197 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV | 1043247 | 1043248 | C74581:78485:5:79215:10792 | 42 | - |
| UTXV | 1043249 | 1043250 | T75S17:78485:5:79215:30204 | 42 | - |
| UTXV | 1043250 | 1043251 | B784W7:78485:5:79215:42548 | 42 | - |
O algoritmo para substituir os valores não é o problema. O interessante é manter as colunas de largura fixa.
Arquivo:
dataconvert.awk
Marque o como executável e
chmod +x dataconvert.awk
você pode iniciá-lo chamando diretamente./dataconvert.awk
Nesta solução, a largura do conteúdo da coluna é armazenada, o resultado preenchido com uma quantidade economizada de espaços e finalmente cortado no comprimento armazenado.
Se o conjunto de dados realmente não tiver exceções no fornecimento dos valores
+
ou-
na coluna 6, a segundaif
cláusula poderá ser omitida. Em grandes conjuntos de dados, isso pode economizar algum tempo.Como o conjunto de dados começa com um delimitador de campo, a primeira coluna está sempre vazia, mas existe. Portanto, a contagem de colunas deve ser
+1
a forma intuitiva de contar.Adaptei a resposta do dodrg para trabalhar com minha estrutura de dados. Aceitei a resposta deles, mas gostaria de postá-la para qualquer pessoa que possa encontrar isso no futuro.