【问题标题】:How to compare the number of delimiters across a unix file to be matching with the top row(fields)?如何比较unix文件中与顶行(字段)匹配的分隔符数量?
【发布时间】:2017-04-24 22:51:03
【问题描述】:

我将 var 设置为

var=$(cat ip.txt | head -1 | sed 's/[^|]//g' | awk '{ print length }')

'|'的数量存储在第一行。

然后,我可以使用

获取每行中的分隔符数量
awk -F\| '{print NF-1}' ip.txt

我需要将我得到的各个数字与$var 进行比较。

所需的最终输出是显示这种行为的行数。 例如,如果第 2 行到第 20 行的分隔符比标题多,那么我的输出应该是,总共 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

标题有 3 个“|”,但第 3,5 和 6 行有额外的分隔符。 所以我想要一个输出,比如“总共 7 行中,3 行的分隔符比顶行多”

【问题讨论】:

  • 提供实际输入样本和预期输出。
  • 用一个例子编辑了问题

标签: bash unix awk text-processing


【解决方案1】:
$ awk -F'|' 'NR==1{n=NF} NF>n{c++} END{printf "%d lines > %d fields\n", c, NR}' ip.txt
3 lines > 7 fields

【讨论】:

  • 一如既往,简单而准确的^,虽然我的回答被否决了,但也能做到!
  • 这很有帮助。虽然,可以对此进行增强吗?我需要删除分隔符数量大于标题的行。上述情况应删除 3 行。
  • 为什么你会要求对你不接受的答案而不是你接受的答案进行改进?无论如何,这个问题已经关闭了 3 个月,您最好提出一个新问题,而不是期待对此问题的持续支持。
【解决方案2】:
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

评论:

  • 这不是 oneliner(“可能是”),但只使用 1 个 awk 来完成所有操作,除非之后需要为脚本分配变量。
  • 为了理解使用的概念,代码是自我注释的(所以看起来有点长)
  • 我稍微更改了请求(计算每个特定的分隔符),但一些简单的修改可能会给出数量而不是细节

【讨论】:

    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2012-02-02
    相关资源
    最近更新 更多