有没有办法打印文件的前 N 个单词?我试过 cut 但它会逐行读取文档。我想出的唯一解决方案是:
sed ':a;N;$!ba;s/\n/δ/g' file | cut -d " " -f -20 | sed 's/δ/\n/g'
本质上,用文件中不存在的字符替换换行符,应用“cut”和空格作为分隔符,然后恢复换行符。
有没有更好的解决方案?
您可以使用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
将文档转换为每行一个单词的格式,然后计算前 N 行:
tr -s ' \011' '\012' < file | head -n $N
N=20
您想要的字数在哪里或任何值。注意tr
是纯过滤器;它只从标准输入读取,只写入标准输出。该-s
选项“挤压”出重复的替换,因此输入中的每个空格或制表符序列都有一个换行符。(如果文件中有前导空白,则会得到一个初始空白行。有多种处理方法,例如将前 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 的一种方法:
perl -lane 'push @a,@F;END{print "@a[0..9]"}' file
注意:索引从零开始,因此示例将打印前十个单词。单词将打印在由单个空格分隔的单行上。
为什么不尝试将您的单词变成线条,然后直接使用head -n 20
呢?
例如:
for i in `cat somefile`; do echo $i; done | head -n 20
它并不优雅,但它确实有相当少的线噪声正则表达式。