我有一个输入分隔符文件。文件中的实际记录数是 4。但是由于值中存在回车符,现在总计数是 8。我只想根据第一列值计算行数。
答案应该是:4。
我尝试使用这些命令,但没有一个起作用:
grep -Eo '[0-9]+|' filename | sort -u | wc -l
awk -F '|' '{sub(/[^[:digit:]]+/, "", $1); a[$1]} END{for (z in a) ++i; print i}' filename
awk -F '|' '{sub(/[^[:digit:]]+/, "", $1); PRINT[$1]} END{for (z in a) ++i; print i}' filename
wc -l filename | sed 's/ *\([0-9]* \).*/\1/'
答案1
这是最接近的:
grep -Eo '[0-9]+|' filename | sort -u | wc -l
但它错过了目标
- 不将匹配锚定到行的开头
- 不必要地对数据进行排序/删除重复项
要锚定表达式,请将其放在"^"
模式的开头,并转义“|” (因为它是元字符):
grep -Eo '^[0-9]+\|' filename | sort -u | wc -l
接下来 - 丢弃sort -u
. grep 忽略连续行,并且如果使用额外信息,则似乎可以删除一些并非真正重复的“重复项”。
最后,丢弃wc -l
:POSIX grep有一个-c
选项告诉 grep 打印匹配的计数。删除该-o
选项(不需要)。所以你需要的是
grep -Ec '^[0-9]+\|' filename
答案2
这可能有效
grep -c ^the desired string filename
wc -l thefile