私は多くのデータマージ印刷を行っており、大規模なデータベースから10個のサンプルを出力できるようにしたいです。私の目標は、提供された.csv(最初の行と最後の行を含む)から均等な間隔の10行を抽出して新しい.csvファイルに出力することです。
ベストアンサー1
この回答では、csvファイルに1行に1行があるとします。つまり、連続した行がないことを意味します。ファイル名がある場合は、db.csv
次のコマンドを使用して最初の行と最後の行を含む10行を取得できます。
awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
どのように動作しますか?
csvファイルはコマンドラインに2回表示されるため、awk
2回読み取られます。最初は、行の総数を取得するために使用されます。 2番目の時間は、選択した10行を印刷するために使用されます。
FNR==NR{next}
NR
これまでに読み取ったレコード(行)の総数。ファイルレコード番号は、FNR
これまでこのファイルから読み取ったレコード(行)の総数と同じです。それで、当時FNR==NR
私たちはまだ最初のファイルを読んでいました。もしそうなら、next
レコードに移動します。FNR==1{n=NR-1}
このコマンドに到達すると、2番目の読み取りの最初の行にあることを意味します。この場合、ファイルの総レコード数があることがわかります
NR-1
。この番号をn
。FNR>x || FNR==n{x+=n/9;print}
2行目の最初の行を読み
FNR==1
、x=0
。だからFNR>x
我々はその行を印刷します。その後、一度に1行ずつ増やしてx
印刷します。n/9
FNR>x
この条件を
FNR==n
使用すると、ファイルの最後の行が印刷されます。
はい
101行のファイルを作成しましょう。
$ seq 101 >db.csv
次のコマンドを使用して、awk
ファイルの最初の行と最後の行を含む10行を印刷できます。
$ 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