Isso fará o trabalho:
awk -F "|" '{print(substr($7,1,1))}' input.file.txt
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
Você também pode usar o corte:
cut -d\| -f7 | cut -c1
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 -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
.
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
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.
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)
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
Isso pode ajudar:
awk -F'[|.]' '{print $7}' filename.txt
Tags text-processing awk