如何比较 unix 文件中的分隔符数量以匹配顶行(字段)?
How to compare the number of delimiters across a unix file to be matching with the top row(fields)?
我正在将 var 设置为
var=$(cat ip.txt | head -1 | sed 's/[^|]//g' | awk '{ print length }')
在第一行存储'|'
的数量。
然后,我可以使用
获取每行中的分隔符数量
awk -F\| '{print NF-1}' ip.txt
我需要将我得到的个人数字与 $var
进行比较。
所需的最终输出是显示此类行为的行数。
例如,如果第 2 行到第 20 行的分隔符比 header 多,那么我的输出应该是,总共 6000 行(文件中的行数)中,第 19 行的分隔符数量比第一行多).
示例:
$ cat ip.txt
DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Lewis|1000
Engg|Smith|Davis|2000|||
HR|Denis|Lillie|1500
HR|Danny|Borrinson|3000|
IT|David|Letterman|2000||
IT|John|Newman|3000
header有3个'|',但是第3,5行和第6行有额外的分隔符。
所以我想要一个输出,比如“3 行的分隔符比总共 7 行中的第一行多”
awk -F '|' '
NR == 1 {
# take the reference of field
RefCount = NF - 1
# skip header
next
}
{
# count the number of line having NF - 1 separator in an array (1 count by number of separator)
LinesWith[ (NF - 1)] ++
# uncomment line after if you want to print bad lines
# if ( NF - 1 != RefCount) print
}
# at the end (of file)
END {
# print each element of the counting array (bad first, good finally)
for ( LineWith in LinesWith) if ( LineWith != RefCount) print "There is/are " LinesWith[ LineWith] " line(s) with " LineWith " separators"
print "There is/are " LinesWith[ RefCount] " correct line(s) with " RefCount " separators"
}
' ip.txt
评论:
- 这不是单行代码 ("could be"),但仅使用 1 个 awk 即可完成所有操作,除了之后需要时没有为脚本分配变量。
- 代码是自我注释的,以理解使用的概念(所以看起来有点长)
- 我稍微更改了请求(计算每个特定的分隔符),但一些简单的修改可能会给出数量而不是详细信息
$ awk -F'|' 'NR==1{n=NF} NF>n{c++} END{printf "%d lines > %d fields\n", c, NR}' ip.txt
3 lines > 7 fields
我正在将 var 设置为
var=$(cat ip.txt | head -1 | sed 's/[^|]//g' | awk '{ print length }')
在第一行存储'|'
的数量。
然后,我可以使用
获取每行中的分隔符数量awk -F\| '{print NF-1}' ip.txt
我需要将我得到的个人数字与 $var
进行比较。
所需的最终输出是显示此类行为的行数。 例如,如果第 2 行到第 20 行的分隔符比 header 多,那么我的输出应该是,总共 6000 行(文件中的行数)中,第 19 行的分隔符数量比第一行多).
示例:
$ cat ip.txt
DeptID|EmpFName|EmpLName|Salary
Engg|Sam|Lewis|1000
Engg|Smith|Davis|2000|||
HR|Denis|Lillie|1500
HR|Danny|Borrinson|3000|
IT|David|Letterman|2000||
IT|John|Newman|3000
header有3个'|',但是第3,5行和第6行有额外的分隔符。 所以我想要一个输出,比如“3 行的分隔符比总共 7 行中的第一行多”
awk -F '|' '
NR == 1 {
# take the reference of field
RefCount = NF - 1
# skip header
next
}
{
# count the number of line having NF - 1 separator in an array (1 count by number of separator)
LinesWith[ (NF - 1)] ++
# uncomment line after if you want to print bad lines
# if ( NF - 1 != RefCount) print
}
# at the end (of file)
END {
# print each element of the counting array (bad first, good finally)
for ( LineWith in LinesWith) if ( LineWith != RefCount) print "There is/are " LinesWith[ LineWith] " line(s) with " LineWith " separators"
print "There is/are " LinesWith[ RefCount] " correct line(s) with " RefCount " separators"
}
' ip.txt
评论:
- 这不是单行代码 ("could be"),但仅使用 1 个 awk 即可完成所有操作,除了之后需要时没有为脚本分配变量。
- 代码是自我注释的,以理解使用的概念(所以看起来有点长)
- 我稍微更改了请求(计算每个特定的分隔符),但一些简单的修改可能会给出数量而不是详细信息
$ awk -F'|' 'NR==1{n=NF} NF>n{c++} END{printf "%d lines > %d fields\n", c, NR}' ip.txt
3 lines > 7 fields