Entrada dada do formulário
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte
como posso truncar apenas a segunda coluna? O delimitador é TAB e a segunda coluna deve ter no máximo 75 caracteres.
Entrada dada do formulário
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar foolkasjfdrte
como posso truncar apenas a segunda coluna? O delimitador é TAB e a segunda coluna deve ter no máximo 75 caracteres.
Respostas:
Se você deseja imprimir apenas os primeiros 75 caracteres da segunda coluna (incluindo espaços e assumindo apenas duas colunas no arquivo), você pode:
$ perl -pe 's/(\t.{75}).*/$1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Ou, com o GNU sed
:
$ sed 's/\(.*\t.\{75\}\).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Ou:
$ sed -r 's/(.*\t.{75}).*/\1/' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Como alternativa, você pode usar fold
, dizendo para cortar os 91 primeiros caracteres (8 para o identificador e 8 para a guia) e imprimir apenas a primeira linha:
$ fold -w 91 file | head -n1
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Se o seu arquivo pode ter mais de 2 colunas e você deseja apenas truncar a segunda, você pode fazer (o que, como acabei de notar, é apenas uma reformulação da resposta de Stephen ):
$ awk -F"\t" -vOFS="\t" '{$2=substr($2,1,75)}1;' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
Ou (observe que isso será interrompido se os primeiros 75 caracteres da 2ª coluna puderem ser interpretados como uma expressão regular):
$ perl -F"\t" -pale 's/$F[1]/substr($F[1],0,75)/e' file
XY981743 foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool
sed
comando também está usando um GNUism ( \t
).
\t
que é um GNUism? A sério? Qual é a maneira portátil de descrever uma guia então?
\n
(e novamente não está presente [...]
com muitas implementações), nenhuma no RHS.
perl
faz pouco sentido. Pense, por exemplo, em uma entrada comoaba\t.*
Usando awk
, divida o arquivo usando guias e produza o primeiro campo completo e os primeiros 75 caracteres (no máximo) do segundo:
awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'
Conforme apontado por fedorqui , você pode manipular arquivos com mais de dois campos, substituindo os campos que você precisa truncar:
awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'
Você pode aplicar a substr
vários campos fazendo um loop sobre eles, se necessário.
;
necessários?
/pattern/ {action} {exception-handling}
por exemplo). Agora, isso seria extremamente improvável, uma vez que omitir essas informações ;
é bastante comum.
Portably / POSIXly com sed
:
tab=$(printf '\t')
sed "s/\($tab[^$tab]\{0,75\}\)[^$tab]*/\1/"
Ou para truncar todas as colunas:
sed "s/\([^$tab]\{75\}\)[^$tab]*/\1/g"
Se houver apenas 2 colunas:
sed -r 's/^([^\t]*\t)(.{0,75}).*/\1\2/'
{0,75}
significa selecionar de 0 a 75 caracteres.
.*
é a seção removida além do caractere 75.
Se houver 2 ou mais colunas:
sed -r 's/^([^\t]*\t)([^\t]{0,75})[^\t]*(.*)/\1\2\3/' file
[^\t]*
é a seção removida além do caractere 75.
sed
e que POSIXLY_CORRECT
não está no ambiente ..
awk 'BEGIN{OFS=FS="\t"} {$2=substr($2,1,75)}1' file