Eu tenho 5000 arquivos txt com os diferentes dados abaixo disso. Eu preciso de um script de shell para copiar apenas a linha 11 (última linha) deles em um único arquivo e classificá-los do menor para o maior.
por exemplo:
file1.txt
1KE5.pdb
USER_CHARGES
INVALID_CHARGES
@<TRIPOS>ATOM
ATOM 1 N MET A 1 40.880 54.110 11.190 1.00 0.00
ATOM 8 HB1 MET A 1 38.760 53.510 9.880 1.00 0.00
ATOM 9 HB2 MET A 1 39.700 52.020 9.980 1.00 0.00
1 40.7
arquivo2.txt
1KW5.pdb
USER_CHARGES
INVALID_CHARGES
@<TRIPOS>ATOM
ATOM 6 HA MET A 1 39.020 54.080 12.120 1.00 0.00
ATOM 7 CB MET A 1 39.050 52.700 10.580 1.00 0.00
ATOM 8 HB1 MET A 1 38.760 53.510 9.880 1.00 0.00
2 33.7
file3.txt
1KW5.pdb
USER_CHARGES
INVALID_CHARGES
@<TRIPOS>ATOM
ATOM 4 H3 MET A 1 40.580 54.900 10.580 1.00 0.00
ATOM 5 CA MET A 1 39.750 53.360 11.780 1.00 0.00
ATOM 6 HA MET A 1 39.020 54.080 12.120 1.00 0.00
3 54.2
Eu preciso que a saída seja:
Final.txt
1 40.7
2 33.7
3 54.2
Eu preciso de um script para resolver esse problema. Obrigado por qualquer ajuda que você pode dar.
linux
command-line
bash
script
ubuntu-15.04
H. aryapour
fonte
fonte
tail -n 1 filename >> output.txt
cada arquivo. envolvê-lo em um comando de localização que sabe como selecionar seus 5000 arquivos, e deve ser bem fácil.Respostas:
Você pode usar
find
para obter os arquivos de entrada,tail
para obter o fim dos arquivos esort
para classificá-los. Por exemplo:Onde
/path/to/
é o caminho para seus arquivosfile*.txt
é o padrão dos seus nomes de arquivos,-type f
encontra somente arquivos, não diretórios,-n1
diz paratail
para retornar 1 linha eoutput.txt
é o arquivo de saída.fonte
Dependendo do que você acha que é mais consistente, a 11ª linha, ou a última linha, você pode usar
sed
outail
, respectivamente. eu prefeririased
como ele manipula vários arquivos com mais clareza e também garante que os arquivos com menos linhas sejam incluídos. Então, você só precisa de uma lista de seus arquivos. Isso poderia ser feito com globbing, se eles estão todos no mesmo diretório, ou comfind
se eles estão aninhados abaixo disso.Então com
find
esed
:O mesmo com
tail
, observe o uso de\;
ao invés de+
para que cada arquivo seja tratado separadamente:Ou talvez globbing:
fonte
Como os seus arquivos de exemplo não possuem uma linha 11, trabalhei com base na sua "(última linha)".
Para reunir as últimas linhas e classificá-las
e, para classificar os resultados e colocar os resultados em um arquivo
Isso pressupõe que os arquivos estão todos em um diretório.
Se os arquivos estiverem em subdiretórios em um nível, altere
file*.txt
para*/file*.txt
Se os arquivos estiverem em vários diretórios aninhados de diferentes profundidades, ou em vários locais, você deverá usar o
find
comando conforme descrito em outras respostas.onde os nomes dos arquivos podem incluir espaços, o que costumava ser um problema.
fonte