6

ファイルの最初の N ワードを出力する方法はありますか? カットしようとしましたが、ドキュメントを 1 行ずつ読み取ります。私が思いついた唯一の解決策は次のとおりです。

sed ':a;N;$!ba;s/\n/δ/g' file | cut -d " " -f -20 | sed 's/δ/\n/g'

基本的に、改行をファイルに存在しない文字に置き換え、スペースを区切り文字として「カット」を適用してから改行を復元します。

より良い解決策はありますか?

4

5 に答える 5

4

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
于 2013-03-25T10:19:39.707 に答える
3

単語が空白で区切られた非空白であると仮定すると、 を使用trしてドキュメントを 1 行に 1 単語の形式に変換し、最初の N 行を数えることができます。

tr -s ' \011' '\012' < file | head -n $N

N=20単語数に必要な場所または任意の値。trは純粋なフィルターであることに注意してください。標準入力からのみ読み取り、標準出力にのみ書き込みます。この-sオプションは、重複した置換を「絞り出す」ため、入力内の一連の空白またはタブごとに 1 つの改行を取得します。(ファイルに先頭の空白がある場合、最初の空白行が得られます。これに対処するには、最初の N+1 行を最終的に出力から取得するか、すべての空白行を除外するなど、さまざまな方法があります。)

于 2013-03-25T10:18:30.540 に答える
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
于 2013-03-25T15:52:39.223 に答える
0

perl を使用した 1 つの方法:

perl -lane 'push @a,@F;END{print "@a[0..9]"}' file

注: インデックスはゼロから始まるため、この例では最初の 10 語が出力されます。単語は、1 つのスペースで区切られた 1 行に出力されます。

于 2013-03-25T11:14:04.170 に答える
0

言葉を線に変えて、head -n 20代わりに使ってみませんか?

例えば:

for i in `cat somefile`; do echo $i; done | head -n 20

エレガントではありませんが、回線ノイズの正規表現がかなり少なくなります。

于 2013-03-25T10:12:34.963 に答える