Como seleciono a primeira coluna da string separada por TAB?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
O exemplo acima retornará a linha inteira e não apenas "LOAD_SETTLED" como esperado.
Atualizar:
Preciso alterar a terceira coluna nos valores separados por tabulação. O seguinte não funciona.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
No entanto, isso funciona conforme o esperado se o separador for vírgula em vez de tabulação.
echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt
awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt
imprimir valores delimitados por tabulação das três primeiras colunas.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
para definir variáveis. É feio para usarBEGIN {FS="\t"}
dentro de um programa embutido , e qualquer contribuição de código aberto que você tente fazer assim provavelmente será contestada. Faça isso apenas se estiver gravando um arquivo de programa . Além disso, é desencorajado usar em-F
vez de-v FS=
porque o último deixa claro que apenasFS
está sendo definido e nãoOFS
. A confusão sobre esse último ponto é o que causou esta postagem em primeiro lugar. É por isso que o "bom estilo" é importante.OFS
variável.Respostas:
Você precisa definir a
OFS
variável (separador de campo de saída) para ser uma guia:(certifique-se de citar a
$line
variável na instrução echo)fonte
$
de$'\t'
não é necessário. O wiki de Greg é melhor: "Destes,$'...'
é o mais comum e atua como aspas simples, exceto que as combinações com escape de barra invertida são expandidas conforme especificado pelo padrão ANSI C".$'\t'
não é necessário. awk entende a string"\t"
como um caractere de tabulaçãoawk -F $'\t' 'BEGIN {OFS = FS} …'
. Isso deveria serawk -v FS='\t' -v OFS='\t' '…'
. Pode parecer pedante, mas ser inconsistente aumenta as chances de que um colaborador posterior introduza um bug por interpretar mal seu código.Certifique-se de que são realmente guias! No bash, você pode inserir uma guia usandoC-v TAB
fonte
Você pode definir o Separador de Campo:
Excelente leitura:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
fonte
Eu uso as variáveis
FS
eOFS
para manipular arquivos de zona BIND que são delimitados por tabulação. Aqui está um dos meus scripts https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39A essência disso é:
Esta é uma maneira limpa e fácil de ler para fazer isso.
fonte
fonte
Isso não deveria funcionar?
fonte