Esta resposta assume que o seu arquivo csv tem uma linha por linha, o que significa que não há linhas contínuas. Se o arquivo for chamado de db.csv
, você poderá obter 10 linhas, incluindo a primeira e a última usando:
awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
Como funciona
Como o arquivo csv está listado duas vezes na linha de comando, awk
o lerá duas vezes. O primeiro é usado para obter o número total de linhas. A segunda vez é usada para imprimir as 10 linhas selecionadas.
-
FNR==NR{next}
NR
é o número total de registros (linhas) lidos até o momento.O número do registro do arquivo,FNR
, é igual ao número total de registros (linhas) lidos tão longe desse arquivo. Então, quandoFNR==NR
, ainda estamos lendo o primeiro arquivo. Em caso afirmativo, apenas pulamos para o registronext
. -
FNR==1{n=NR-1}
Se chegarmos a este comando, isso significa que estamos na primeira linha do segundo passo. Nesse caso, sabemos que o número total de registros no arquivo é
NR-1
. Nós salvamos esse número comon
. -
FNR>x || FNR==n{x+=n/9;print}
Uma na primeira linha da segunda leitura,
FNR==1
ex=0
. Assim,FNR>x
e nós imprimimos essa linha. Em seguida, incrementamosx
porn/9
e imprimimos uma linha na próxima vez queFNR>x
e assim por diante.A condição
FNR==n
garante que a última linha do arquivo será impressa.
Exemplo
Vamos criar um arquivo com 101 linhas:
$ seq 101 >db.csv
Agora, podemos usar nosso comando awk
para imprimir 10 linhas do arquivo, incluindo a primeira e a última:
$ awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
1
12
23
34
45
57
68
79
90
101