ファイルに行範囲を書き込む(1〜N)Bash、Awk、またはSedスクリプト

ファイルに行範囲を書き込む(1〜N)Bash、Awk、またはSedスクリプト

入力ファイルから必要な行番号をすでに抽出しています(つまり、1からNまで)。これで、この1からNまでの入力ファイルを使用して新しいファイルに出力できるはずです。入力ファイルから行番号を抽出した以前の関数で発生しました。入力ファイルを使用してこの数値範囲を取得し、その範囲を新しいファイルに出力する必要があります。新しいファイルに対して1からNまで実行します。

私は現在、bashスクリプトとAwkを使用して入力ファイルから範囲データを生成するために必要な情報を抽出しています。この怒りを受け入れて、1からNまで(入力ファイルを使用して)新しいファイルを作成する必要があります。

頑張った

sed -i '1,'"$N" input.txt > input.log

入力ファイル input.txt を使用し、1 から N まで input.log ファイルに出力しますが、次のエラーが発生します。

sed: -e expression #1, char 3: missing command

上記のコード行はbashスクリプト内にあります。

答え1

head仕事に最適なツールのようです。

head -n "$N" input.txt > input.log

を使用するときは、アプローチsedに応じてコマンドを指定する必要があります。これはpコマンド-nとオプションであるため、デフォルトではパターンスペースを印刷しません。

sed -n "1,${N}p" input.txt > input.log

しかし、

sed "$N q" input.txt > input.log

Nファイル全体を読み取る(完了したジョブでもあるhead)よりも、最初の行だけを読んで停止する(完了したジョブでもある)方が効率的ですsed "1,${N}p"

Nこれらのメソッドは、1以上の場合にのみ同じ出力を生成します。 1より小さいと動作が異なります。

答え2

会議

sed "${N}q" file

何をすべきか?

答え3

MからNまでの行の場合(M <= Nであると仮定):

head -n N input.txt | tail -n $(( N - M + 1))

または

cat input.txt | head -n N | tail -n $(( N - M + 1))

後者の形式は、すべてのストリームで使用できます。

答え4

作業を簡単にするには、「引用符なし」の二重引用符を使用します。

head -$N ex
sed "$N q" ex
sed -n "1,$N p" ex
awk "NR <= $N" ex
perl -ne "print if $. <= $N" ex
grep -m $N . ex

関連情報