【问题标题】:Finding gaps in csv column using AWK使用 AWK 查找 csv 列中的空白
【发布时间】:2016-10-14 20:02:17
【问题描述】:

我尝试使用 AWK 查找列中数字顺序列表中的空白。我发现this question 与我的要求相同,但无法使其正常工作。 我的输入在 csv 中,看起来类似于以下内容。

aaa,bbb,ccc,ddd,eee,fff,ggg
0,22,33,44,55,66,77
1,88,99,11,12,13,14
2,154,165,-22,-31,-40,-49
3,220,231,-55,-74,-93,-112
6,418,429,-154,-203,-252,-301
7,484,495,-187,-246,-305,-364
8,550,561,-220,-289,-358,-427

我试过了

awk 'NR>1 && $1!=p+1{print p+1"-"$1-1}{p=$1}' file

即使存在范围,它也会继续打印。 我怀疑这可能是因为我从 0 而不是 1 开始我的值,做了一些变通方法,仍然无法让它工作。

我希望在存在间隙时打印警告,例如在这种情况下 “缺少 4-5”

非常感谢任何帮助。

【问题讨论】:

  • 你的预期输出是什么?
  • 要么您的描述错误,要么您的示例错误,因为您的描述说您的输入是 CSV,但您的示例不包含逗号。修正您的问题,使其准确无误。
  • @EdMorton 我已经用 CSV 更新了这个问题。当我从excel复制数据时,它已经删除了逗号。我的道歉
  • @anubhava 我希望打印缺失的范围,在本例中为 4-5

标签: bash awk


【解决方案1】:

您可以使用此 awk 命令获取 csv 文件第一列中缺少数字的输出:

awk -F, '{while (NR>2 && $1 > p+1) print ++p; p=$1} 1' file.csv

aaa,bbb,ccc,ddd,eee,fff,ggg
0,22,33,44,55,66,77
1,88,99,11,12,13,14
2,154,165,-22,-31,-40,-49
3,220,231,-55,-74,-93,-112
4
5
6,418,429,-154,-203,-252,-301
7,484,495,-187,-246,-305,-364
8,550,561,-220,-289,-358,-427

【讨论】:

  • 如果您只想要缺失值,请使用:awk -F, '{while (NR>2 && $1 > p+1) print ++p; p=$1}' file.csv
  • 非常感谢您的帮助。这正是我想要的!
  • 我很抱歉。我没有不接受你的回答。我首先接受了你的回答,后来我也接受了 karakfa 的回答。后一个动作“自动”不接受您的回答。我是stackoverflow的新手。一个问题只能有一个被接受的答案吗?
【解决方案2】:

你需要稍微扭曲一下来处理标题和初始值(这里是 0,在引用的脚本中没有正确处理)

$ awk 'NR==1{p=$1-1; next} $1!=p+1{print p+1"-"$1-1} {p=$1}' file

5-19

【讨论】:

  • 感谢您的回答,但对我不起作用。我已使用有效的 CSV 更新了问题。我试过你的解决方案
  • $ awk 'NR==1{p=$1-1;下一个} $1!=p+1{打印 p+1"-"$1-1} {p=$1}' 摘要.csv 0--1 1-0 2-1 3-2 4-5 7-6 8- 7
  • 对多个 cmets 表示歉意。按“输入”提交我的 cmets。无论如何,当我尝试您的解决方案时,我得到了上述输出
  • 好吧..,现在这是一个不同的输入文件,您必须将输入分隔符指定为-F,
  • 很抱歉给您带来了困惑。你对-F的建议,奏效了!!非常感谢..
猜你喜欢
  • 2021-06-27
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2019-05-26
  • 2017-11-25
相关资源
最近更新 更多