cortando um campo para comprimento com awk / sed [duplicado]

5

Eu tenho um grupo grande de arquivos que contém vários campos delimitados por canais.

5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|1212121212121212121212121212|2|0|1000|70|33107||1|Event 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|2323232323232323232323232323|2|0|1000|70|33107||1|Event 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|3434343434343434343434343434|2|0|1000|70|33107||1|Event 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|4545454545454545454545454545|2|0|1000|70|33107||1|Event 5595340959340|1|MXPYAQWE|870569689456954654|0|0|20181018224126|5656565656565656565656565656|2|0|1000|70|33107||1|Event

Observe o oitavo campo. Atualmente, ele tem 29 caracteres e eu devo cortá-lo para que ele tenha apenas cinco caracteres.

A única solução (complicada) que eu criei é esta:

Isole os campos que quero aparar:

awk -F "|" '{print $8}' > Original_Fields

Apare os campos

cp Original_Fields Temp
more Temp | cut -c -5 > Trimmed_Fields

Crie um script de susbtituição com sed

grep -rh -f <file_with_matching_strings> /path/to/files > Original_Strings
vi Original_Strings
:%s/^/grep -rl "/g
:%s/$/" \/path\/to\/file | xargs sed -i 's\//g
:wq!

E edite os arquivos Original_Fields e Trimmed_Fields, então acabo com

grep -rl /path/to/file | xargs sed -i 's/Original_Field/Trimmed_Field/g'

Isso funciona, mas eu suspeito strongmente que deve haver uma maneira mais rápida de realizar isso com o AWK e o SED, para que eu possa fazer tudo isso em apenas uma etapa.

    
por Alan Mackey 27.11.2018 / 09:13

2 respostas

12

Sim, você pode cortar e reconstruir cada linha com o AWK:

awk -F'|' 'BEGIN { OFS = FS } { $8 = substr($8, 1, 5); print }'

Isso define os separadores de entrada e saída como “|”, e para cada linha de entrada, reduz o oitavo campo a cinco caracteres no máximo e imprime todos os campos (incluindo o campo atualizado).

    
por 27.11.2018 / 09:16
1

Como seu arquivo tem largura fixa - ou pelo menos parece - você pode fazer isso contando colunas para manter e descartar em sed:

sed -r 's/(.{68}).{23}(.*)//' yourfile
    
por 27.11.2018 / 10:21