Localizando um caractere de uma coluna

3

Eu tenho uma string separada por pipe (|), preciso encontrar o primeiro caractere na sétima coluna dessa string separada por pipe

AAAAAA|04|XXXXXXX|20170210-163119|||2.0|20170208||

Resultado esperado: 2

    
por CoderAkki 06.03.2017 / 12:32

6 respostas

4

Isso fará o trabalho:

awk -F "|" '{print(substr($7,1,1))}' input.file.txt
    
por 06.03.2017 / 12:39
9

Você também pode usar o corte:

cut -d\| -f7 | cut -c1
    
por 06.03.2017 / 13:53
2

Bash

IFS='|' read -r -a x <<< "$str"
echo "${x[7]:0:1}"
O comando

read usa o conteúdo de $ str e os divide no caracter pipe | e os preenche em um array ( -a ) chamado x. Então, extraímos um caractere do início do sétimo campo.

Perl

perl -F'\|' -pale '($_) = $F[6] =~ /./g' <<< "$str"

-F = > separador de campos, -p = > modo de autoprint, -a = > autosplit ativado, -l = > configure o separador de registro ( RS ) para \n e ORS para \n .

O 7º campo $F[6] é avaliado em um contexto de lista e como /./g e retorna caracteres individuais, dos quais o primeiro é selecionado e armazenado no $_ que, devido ao autoprint , o levará para stdout .

Expr

sep='|'
fld="[^$sep]*"
fld7=$(yes "$fld$sep" | sed 7q | tr -d '\n')
expr "$str" : "$fld7\(.\)"

Aqui nós construímos o comando para que expr faça seu trabalho under the hood .

echo "$fld"; # => [^|]* echo "$fld7"; # => [^|]*[^|]* .... 7 vezes

    
por 06.03.2017 / 13:27
1

Usando python3 , assumindo que a coluna 7 existe em todas as linhas no arquivo :

python3 -c "[print(l.split('|')[6][0]) for l in open('f').readlines()]"

> 2

Em que 'f' é o caminho (completo) para o arquivo, entre aspas simples.

Explicação

open('f').readlines()

lerá o arquivo por linha e

s.split('|')[6][0] 

dividirá a linha pelo delimitador | e, em seguida, imprimirá o primeiro caractere da sétima coluna (onde 0 é o índice da primeira coluna)

    
por 06.03.2017 / 13:26
1

Para estudar o interessante comportamento sed

sed 's/\(\([^|]\?\)[^|]*|\)\{7\}.*//' input.file.txt

ou para reduzir o escape

sed -r 's/(([^|]?)[^|]*\|){7}.*//' input.file.txt

ou para evitar o regex

sed '/\n/{s/./\n/2;P;d;};s/|/\n/6;s/$/\n/;D' input.file.txt
    
por 06.03.2017 / 15:45
0

Isso pode ajudar:

awk -F'[|.]' '{print $7}' filename.txt
    
por 06.03.2017 / 12:40