ファイルの最初の N ワードを出力する方法はありますか? カットしようとしましたが、ドキュメントを 1 行ずつ読み取ります。私が思いついた唯一の解決策は次のとおりです。
sed ':a;N;$!ba;s/\n/δ/g' file | cut -d " " -f -20 | sed 's/δ/\n/g'
基本的に、改行をファイルに存在しない文字に置き換え、スペースを区切り文字として「カット」を適用してから改行を復元します。
より良い解決策はありますか?
awk
最初の n 単語を出力するために使用できます。
$ awk 'NR<=8{print;next}{exit}' RS='[[:blank:]]+|\n' file
これにより、最初の 8 ワードが出力されます。各単語は個別の行に出力されます。ファイルの元の形式を維持しますか?
編集:
以下は、ファイルの元の形式を保持します。
awk -v n=8 'n==c{exit}n-c>=NF{print;c+=NF;next}{for(i=1;i<=n-c;i++)printf "%s ",$i;print x;exit}' file
デモ:
$ cat file
one two
thre four five six
seven 8 9
10
$ awk -v n=8 'n==c{exit}n-c>=NF{print;c+=NF;next}{for(i=1;i<=n-c;i++)printf "%s ",$i;print x;exit}' file
one two
thre four five six
seven 8
小さな注意点: 印刷された最後の行が区切り文字として単一のスペースを使用していない場合、この行は書式設定が失われます。
$ cat file
one two
thre four five six
seven 8 9
10
# the 8th word fell on 3rd line: this line will be formatted with single spaces
$ awk -v n=8 'n==c{exit}n-c>=NF{print;c+=NF;next}{for(i=1;i<=n-c;i++)printf "%s ",$i;print x;exit}' file
one two
thre four five six
seven 8
単語が空白で区切られた非空白であると仮定すると、 を使用tr
してドキュメントを 1 行に 1 単語の形式に変換し、最初の N 行を数えることができます。
tr -s ' \011' '\012' < file | head -n $N
N=20
単語数に必要な場所または任意の値。tr
は純粋なフィルターであることに注意してください。標準入力からのみ読み取り、標準出力にのみ書き込みます。この-s
オプションは、重複した置換を「絞り出す」ため、入力内の一連の空白またはタブごとに 1 つの改行を取得します。(ファイルに先頭の空白がある場合、最初の空白行が得られます。これに対処するには、最初の N+1 行を最終的に出力から取得するか、すべての空白行を除外するなど、さまざまな方法があります。)
GNU awk を使用して、RS を正規表現に設定し、RT を使用して一致する文字列にアクセスできるようにします。
$ cat file
the quick
brown fox jumped over
the
lazy
dog's back
$ gawk -v c=3 -v RS='[[:space:]]+' 'NR<=c{ORS=(NR<c?RT:"\n");print}' file
the quick
brown
$ gawk -v c=6 -v RS='[[:space:]]+' 'NR<=c{ORS=(NR<c?RT:"\n");print}' file
the quick
brown fox jumped over
$ gawk -v c=9 -v RS='[[:space:]]+' 'NR<=c{ORS=(NR<c?RT:"\n");print}' file
the quick
brown fox jumped over
the
lazy
dog's
perl を使用した 1 つの方法:
perl -lane 'push @a,@F;END{print "@a[0..9]"}' file
注: インデックスはゼロから始まるため、この例では最初の 10 語が出力されます。単語は、1 つのスペースで区切られた 1 行に出力されます。
言葉を線に変えて、head -n 20
代わりに使ってみませんか?
例えば:
for i in `cat somefile`; do echo $i; done | head -n 20
エレガントではありませんが、回線ノイズの正規表現がかなり少なくなります。