文件的行是这样的。
<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
答案 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}' ...