【问题标题】:Linux, awk and how to count and print consecutive lines in a file?Linux,awk以及如何计算和打印文件中的连续行?
【发布时间】:2017-04-30 01:41:41
【问题描述】:

例如我有一个类似的文件:

  apple
  apple
  strawberry

我想要实现的是打印连续的行(apple)并计算它连续的次数(2),如下所示:apple-2 using awk。

到目前为止,我的代码是这样的,但它执行以下操作:apple1-apple1。

awk '{current = $NF;
getline;
if($NF == current) i++; 
printf ("%s-%d",current,i) }' $file

提前谢谢你。

【问题讨论】:

  • 你能澄清一下你的输入文件是什么样的吗?您的示例表明文件中有一行,包含 3 个单词。相反,您的文件是否有 3 行,每行一个单词?基本上,这是您想要的输出:uniq -c infile | awk '{ print $2 , $1 }' 吗?
  • 非常抱歉,我打错了输入文件。是的,你是对的,我每行只有一个单词,所以 3 行。
  • 行中的每个单词前面是否有连字符 - ?
  • 不,我只是想列出一个清单给你看,但我是这个网站的新手,我失败了,抱歉。 @michael_n 你给我的输出几乎是我想要的,但我只想打印连续的单词(一次)以及它连续的次数。希望我能说清楚。
  • @MattPhilips 您可以像使用 awk 代码一样编辑问题并正确格式化输入文件。

标签: linux shell awk


【解决方案1】:

uniq -c 和 awk 进行过滤怎么样:

$ uniq -c foo|awk '$1>1'
      2   apple

【讨论】:

    【解决方案2】:

    给定:

    $ cat file
    apple
    apple
    strawberry
    mango
    apple
    strawberry
    strawberry
    strawberry
    

    你可以这样做:

    $ awk '$1==last{seen[$1]++} 
                   {last=$1}
           END{for (e in seen) 
                print seen[e]+1, e}' file
    2 apple
    3 strawberry
    

    【讨论】:

    • 这不能正常工作,如果你有例如两个苹果之后的两个草莓。输出:2个苹果4个草莓
    • @Joseph 我无法重现。如果我有echo $'apple\napple\nstrawberry\nstrawberry' | [that awk script],它会打印2 apple \n2 strawberry
    • 我的意思是将这 4 行替换为 test 文件的前 3 行,或者在末尾添加 2 个或更多 apples,你会看到会发生什么。
    猜你喜欢
    • 2017-09-10
    • 2011-09-02
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    相关资源
    最近更新 更多