Você pode tentar:
awk '{ print $3; }' subject.txt | sed -n 's/\([0-9]\{10\}\).*//p'
Eu tenho um arquivo para, por exemplo, com três colunas
12345678910 14567855858855 12345678510750078
Eu quero considerar apenas os 10 primeiros dígitos da terceira coluna com sed ou awk.
A saída esperadaé:
1234567851
Por favor ajude
Este comando sed fornecerá os primeiros 10 dígitos da última coluna.
Sua pergunta é um pouco confusa em termos de primeiro ou último 10 ou 14 dígitos :-)
Mas, você pode ajustar da mesma forma neste exemplo.
$ echo "12345678910 14567855858855 12345678510750078" \
| sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$// p'
1234567851
Interpretando o comando (para que você possa modificá-lo conforme necessário).
sed -n 's/.*\s\([0-9]\{10\}\)[0-9]*$// p'
| | | | | | | | | ^ print what remains on the matched line
| | | | | | | | ^^ replace the line with the part of interest
| | | | | | | ^^^^^^^ match for the last column
| | | | | | ^^ mark the end of part we want to print
| | | | | ^^^^^^^^^^^ this will match 10 digits at the start of the last column
| | | | ^^ start marking the part we want to print
| | | ^ start matching the digits after a white-space char
| | ^^ pattern begins matching everything up to the part of interest
| ^ process only lines that match the given pattern
^^ do not print the original input string
Você pode ajustar isso para seus dados.
Tal como está, devido à parte [0-9]*$
desta regra, espera-se que os seus dados não tenham espaços em branco ou caracteres não numéricos depois ou dentro da última coluna.
Atualize seu comentário.
Enquanto este exemplo usa um eco de sua linha única para demonstrar seu caso de teste,
Você pode disparar o comando em todo o seu arquivo da seguinte forma,
cat input-file.txt | <sed-command-above> > output-file.txt
ou
<sed-command-above> input-file.txt > output-file.txt
O primeiro formulário mostra como um echo
funcionará para todo o arquivo de várias linhas também.
Você também pode fazer um pequeno teste com um head input-file.txt
canalizado para o comando sed para ver como ele funciona nas primeiras 10 linhas do arquivo de entrada.
Perl para o resgate:
perl -lne 'print /(\d{10})\d*$/' < filename
-n
lê a linha de entrada por linha -l
adiciona novas linhas à saída $
corresponde ao fim da linha, os primeiros 10 dígitos precedendo quaisquer outros dígitos antes do final serem capturados, e /.../
no contexto de lista imposto por print
retorna que Se você soltar apenas a solução sed, tente:
cat /tmp/textfile | sed -n -e '$!d;s/.*\s\([0-9]\{10\}\)[0-9]*$// p'
o substituto funcionou apenas na última linha.