Como adicionar colunas a um arquivo (de preferência usando sed -i) quando há apenas uma coluna?

Como adicionar colunas a um arquivo (de preferência usando sed -i) quando há apenas uma coluna?

Digamos que eu tenha uma coluna de dados como esta:

sample123
sample456
samplexyz

Posso facilmente adicionar duas novas colunas usando:

sed -i "s/$/\t1.1\tC/" <file.txt>

Agora é:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C

Agora digamos que eu acrescente alguns novos dados na parte inferior:

sample123   1.1 C
sample456   1.1 C
samplexyz   1.1 C
sampleNew1
sampleNew2
sampleNew3

Se eu tentar anexar as novas colunas a esses dados, ele será anexado a todas as linhas, então agora, quando executo:

sed -i "s/$/\t1.2\tA/" <file.txt>

Parece:

sample123   1.1 C   1.2 A
sample456   1.1 C   1.2 A
samplexyz   1.1 C   1.2 A
sampleNew1  1.2 A
sampleNew2  1.2 A
sampleNew3  1.2 A

Como adiciono as colunas onde não há outras colunas exceto a primeira?

Responder1

Teste primeiro se a linha atual possui tabulação ou não, e só faça a substituição se não tiver:

sed -i '/\t/!s/$/\t1.2\tA/' file

Aqui, abordamos todas as linhas que não contêm um caractere de tabulação usando /\t/!e aplicamos a substituição a essas linhas.

O texto acima pressupõe que o GNU sedseja capaz de reconhecer \tcomo um caractere de tabulação. Outras sedimplementações podem precisar usar um caractere de tabulação literal no lugar de \t. Outras sedimplementações também podem lidar com a -iopção de forma diferente do GNU sed(veja "Como posso conseguir portabilidade com sed -i (edição no local)?").


Usando awk:

awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Isso testaria o número de campos delimitados por tabulação e, se houvesse apenas um único campo, adicionaria um novo segundo e terceiro campo antes de imprimir a linha.

Isso não alteraria o arquivo no local. Para isso, use GNU awkassim:

awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file

Para obter mais informações sobre awkedições no local, consulte "Como alterar permanentemente um arquivo usando o awk? (edições "no local", como com "sed -i")".

informação relacionada