Bash 如何获取一行中某部分的字数

Bash 如何获取一行中某部分的字数,bash,awk,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|u文件| wc-l 但它

文件的行是这样的

<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|u文件| wc-l

但它在awk部分中抛出了空白,这表明它并没有按照我想要的方式使用
| | |
(作为分隔符),有趣的是,如果我使用
$1
而不是
$2
,它会打印整个文本

但是,如果我使用
| |
(即前后的
空格
),它会提供一些输出,但不会将两个delimeter之间的句子视为一个字段,即如果我使用以下内容,它会打印
每个
,而不是整个句子

awk-F'| |''{print$2}'word_文件

如何使用bash命令实现这一点

供参考
awk版本-GNU awk 4.0.1

awk的
-F
选项,该选项设置输入字段分隔符
FS
,需要一个正则表达式作为其值

因此,要将
| |
解释为文字,必须对
\
字符进行转义,这些字符是正则表达式上下文中的元字符

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

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

awk -F '\\|\\|\\|' 'BEGIN { orgFs=FS } { FS=" "; $0 = $2; print NF; FS=orgFS }' word_file
这将按文本
| | |
将每个输入行拆分为字段

通过将
FS
临时设置为一个空格(这是一个神奇的值,告诉Awk通过任何非空的空格将字段拆分为多个字段),我们可以将字段2的值
$2
分配给整个输入行
$0
,从而使
$0
的新值再次拆分为多个字段

此时,
NF
反映了最初第二个字段中的字段数,即单词数,我们可以打印出来


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

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

$ awk -v RS="\\\|\\\|\\\|" 'NR==2{print NF}' file
或者,如果不知道如何逃离管道,也许用清洁剂

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