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 sed
seja capaz de reconhecer \t
como um caractere de tabulação. Outras sed
implementações podem precisar usar um caractere de tabulação literal no lugar de \t
. Outras sed
implementações também podem lidar com a -i
opçã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 awk
assim:
awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
Para obter mais informações sobre awk
edições no local, consulte "Como alterar permanentemente um arquivo usando o awk? (edições "no local", como com "sed -i")".