开发者社区> 问答> 正文

AWK每隔一列打印一次,从最后一列(和最后一列旁边)开始进行N次交互(从右到左打印)

0

希望世界上有人可以帮助我,以及遇到类似问题的其他人,找到一个简单的解决方案来捕获数据。我已经花了几个小时尝试使用一个线性脚本来解决我认为是一个简单的问题,涉及awk,一个csv文件并将输出另存为bash变量。简而言之,这就是坚果...

任务:

1)从LAST COLUMN开始,每隔一列输出特定的迭代计数。

2)要输出每隔一列,从NEXT到LAST COLUMN开始,具有特定的迭代计数。

数据(file.csv):

@12@SayWhat@2@4@2.25@3@1.5@1@1@1@3.25
@7@Smarty@9@6@5.25@5@4@4@3@2@3.25
@4@IfYouLike@4@1@.2@1@.5@2@1@3@3.75
@3@LaughingHard@8@8@13.75@8@13@6@8.5@4@6
@10@AtFunny@1@3@.2@2@.5@3@3@5@6.5
@8@PunchLines@7@7@10.25@7@10.5@8@11@6@12.75

任务1的预期结果:

2@2.25@1.5@1@3.25
  9@5.25@4@3@3.25
  4@.2@.5@1@3.75
  8@13.75@13@8.5@6
  1@.2@.5@3@6.5
  7@10.25@10.5@11@12.75

任务2的预期结果:

SayWhat@4@3@1@1
  Smarty@6@5@4@2
  IfYouLike@1@1@2@3
  LaughingHard@8@8@6@4
  AtFunny@3@2@3@5
  PunchLines@7@7@8@6

展开
收起
祖安文状元 2020-01-07 14:28:30 549 0
1 条回答
写回答
取消 提交回答
  • 当然,有更优雅的方法可以做到这一点,但我并不是一个真正的awk人:

    第1部分:

    awk -F@ '{ x = ""; for (f = NF; f > (NF - 5 * 2); f -= 2) { x = x ? $f "@" x : $f ; } print x }' file.csv
    
    

    输出:

    2@2.25@1.5@1@3.25
    9@5.25@4@3@3.25
    4@.2@.5@1@3.75
    8@13.75@13@8.5@6
    1@.2@.5@3@6.5
    7@10.25@10.5@11@12.75
    
    

    第2部分:

    awk -F@ '{ x = ""; for (f = NF - 1; f > (NF - 5 * 2); f -= 2) { x = x ? $f "@" x : $f ; } print x }' file.csv
    
    

    输出:

    1. SayWhat@4@3@1@1
    Smarty@6@5@4@2
    IfYouLike@1@1@2@3
    LaughingHard@8@8@6@4
    AtFunny@3@2@3@5
    PunchLines@7@7@8@6
    5```  
    每一个中的文字都是您的“迭代次数”。
    2020-01-07 14:28:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载