如何获取一部分行的字数

时间:2016-12-01 02:30:22

标签: bash awk

文件的行是这样的。

<some character> ||| each line. So far i can get the total number of lines and the text for each on its own line ||| <some text>

现在我想计算|||

之间的单词数

我打算做的是

awk -F '|||' '{print $2}' word_file | wc -l

但它在awk部分中抛出空白,这表明它没有按照我想要的|||(这是一个分隔符),有趣的是,如果我使用$1而不是$2 ,它打印全文

但是,如果我使用|||(即之前和之后的space),它会给我一些输出,但不会将两个分隔符之间的句子视为一个字段,即它会打印{{1}如果我使用以下

,而不是整个句子

each

如何使用bash命令实现此目的

FYI     awk -F ' ||| ' '{print $2}' word_file

2 个答案:

答案 0 :(得分:1)

Awk&#39; -F选项设置FS(输入字段分隔符),需要正则表达式作为其值。

因此,要将|||解释为文字,您必须\ - 转义|字符,它们是正则表达式上下文中的元字符。

鉴于Awk还接受字符串文字中基于\的转义序列,您必须加倍 \个实例:
awk -F '\\|\\|\\|' ...

要在字段2中正确计算单词(定义为以空格分隔的标记),您可以尝试:

awk -F '\\|\\|\\|' 'BEGIN { orgFs=FS } { FS=" "; $0 = $2; print NF; FS=orgFS }' word_file

这会将每个输入行按 literal |||拆分为字段。

通过暂时FS设置为一个空格 - 这是一个神奇的值,告诉Awk通过任何非空的空格分割成字段 - 我们可以将$2(字段2的值)分配给整个输入行$0,这会导致$0的新值再次拆分为字段。

此时NF反映了原来第二个字段中的字段数 - 即字数 - 我们可以打印出来。

FS恢复为原始值,然后准备解析下一个输入行。

答案 1 :(得分:0)

使用gawk多字符RS支持,这可能更容易

$ awk -v RS="\\\|\\\|\\\|" 'NR==2{print NF}' file

或者如果不确定如何逃脱管道,或许更清洁

$ awk -v RS='[|]{3}' ...