Como truncar a segunda coluna para um determinado tamanho

6

Dada a entrada 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.

    
por LoukiosValentine79 11.05.2015 / 11:16

4 respostas

6

Se você deseja imprimir apenas os primeiros 75 caracteres da segunda coluna (incluindo espaços e assumindo apenas duas colunas no arquivo), você pode fazer:

$ 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\}\).*//' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool

Ou:

$ sed -r 's/(.*\t.{75}).*//' file
XY981743    foobarlkasdf saflkas asfZR!sgfad asdSAD asdsadf SAdfasdf46lk lksad bar fool

Como alternativa, você pode usar fold , dizendo para cortar os primeiros 91 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 puder ter mais de 2 colunas e você quiser apenas truncar o segundo, você pode fazer (o que, como acabei de notar, é apenas uma reformulação de Resposta de Estevão ):

$ 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 segunda 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
    
por 11.05.2015 / 12:49
8

Usando awk , divida o arquivo usando as guias e imprima o primeiro campo inteiro e os primeiros 75 caracteres (no máximo) do segundo:

awk -F "\t" 'BEGIN { OFS=FS }; { print $1, substr($2, 1, 75); }'

Como apontado por fedorqui , você pode manipular arquivos com mais de dois campos, substituindo os campos necessários truncar:

awk -F "\t" 'BEGIN { OFS=FS }; { $2=substr($2, 1, 75); print }'

Você pode aplicar o substr a vários campos fazendo um loop sobre eles, se necessário.

    
por 11.05.2015 / 11:23
4

Portável / POSIXly com sed :

tab=$(printf '\t')
sed "s/\($tab[^$tab]\{0,75\}\)[^$tab]*//"

Ou para truncar todas as colunas:

sed "s/\([^$tab]\{75\}\)[^$tab]*//g"
    
por 11.05.2015 / 12:58
2

Se houver apenas 2 colunas:

sed -r 's/^([^\t]*\t)(.{0,75}).*//'

{0,75} significa selecionar de 0 a 75 caracteres.
.* é a seção removida além de caracteres 75.

Se houver 2 colunas ou mais :

sed -r 's/^([^\t]*\t)([^\t]{0,75})[^\t]*(.*)//' file

[^\t]* é a seção removida além do caractere 75.

    
por 11.05.2015 / 11:57