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