Eu tenho vários arquivos, algo como: (na realidade eu tenho 80)
file1.dat
2 5
6 9
7 1
file2.dat
3 7
8 4
1 3
Quero terminar com um arquivo contendo todas as segundas linhas. ie
output.dat
6 9
8 4
O que eu tenho até agora dá laços nos nomes dos arquivos, mas depois sobrescreve o arquivo antes dele. por exemplo, a saída dos arquivos acima seria apenas
8 4
meu script shell fica assim:
post.sh
TEND = 80
TINDX = 0
while [ $TINDX - lt $TEND]; do
awk '{ print NR==2 "input-$TINDX.dat > output.dat
TINDX = $((TINDX+1))
done
awk 'FNR==2' file{1..80}.dat > output.dat
Que tal ...
head -n 2 input.dat | tail -n 1 | awk
...fonte
head
/tail
é definitivamente uma opção, você não precisa deawk
então.sed
seria suficiente:-s
A opção é necessária para imprimir a segunda linha de cada arquivo; caso contrário, apenas a segunda linha do primeiro arquivo será impressa.fonte
a
sed
solução do aragaer é melhor, sim. Mas como eu gosto dehead|tail
cortar, tenho umahead|tail
solução que suporta vários arquivos, não apenas uminput.dat
. O uso de um loop for, em vez de passar uma lista de arquivos para o sed, também facilita a realização de outras coisas com o arquivo antes / depois de extrair a segunda linha com o sed.Versão multilíngue copiosamente comentada:
Nota: o código abaixo será executado. Somos livres para colocar uma quebra de linha depois de um
|
,&&
ou||
, e continuar o nosso comando na linha seguinte; podemos até colocar comentários no meio. Passei anos sem saber disso (e realmente não vendo isso em lugar nenhum). Esse estilo é menos útil no prompt interativo, mas limpa os arquivos de script sem fim.fonte
Obviamente, existem muitas maneiras de fazer isso - acho que gosto mais da resposta sed do @ aragaer .
Aqui está um que usa built-in puramente bash e não precisa usar nenhum utilitário externo:
fonte
Para um uso eficiente
awk
esed
nas respostas aqui em vários arquivos, é melhor usar anextfile
instrução para pular o processamento de linhas indesejadasawk
.e com
sed
, podemos sair ao processar na 3ª linha esed
processaremos o próximo arquivo.fonte