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

托马斯·潘恩

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

任务:

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

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

数据(file.csv):

@12@SayWhat@2@[email protected]@[email protected]@1@1@[email protected]
@7@Smarty@9@[email protected]@5@4@4@3@[email protected]
@4@IfYouLike@4@[email protected]@[email protected]@2@1@[email protected]
@3@LaughingHard@8@[email protected]@8@13@[email protected]@4@6
@10@AtFunny@1@[email protected]@[email protected]@3@3@[email protected]
@8@PunchLines@7@[email protected]@[email protected]@8@11@[email protected]

任务1的预期结果:

  [email protected]@1.5@[email protected]
  [email protected]@4@[email protected]
  [email protected]@.5@[email protected]
  [email protected]@[email protected]@6
  [email protected]@.5@[email protected]
  [email protected]@10.5@[email protected]

任务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

我的尝试:

我为解决以上任何问题而遇到的问题是,任务1的管道很丑(可以给猫皮剥皮了)。但是,它不使用任何已声明的迭代(应该为5)。而且,我完全无法解决任务2。

任何有助于简化以下内容和解决任务2的帮助都将受到HELLA的赞赏!

outcome=$( awk 'BEGIN {FS = "@"} {for (i = 0; i <= NF; i += 2) printf ("%s%c", $(NF-i), i + 2 <= NF ? "@" : "\n");}' file.csv | sed 's/@@.*//g' | awk -F@ '{for (i=NF;i>0;i--){printf $i"@"};printf "\n"}' | sed 's/@$//g' | awk -F@ '{$1="";print $0}' OFS=@ | sed 's/^@//g' );

另外,如果为特定的迭代次数执行循环有助于解决此问题,那么魔术数为5。也许解决方案可能是for循环,该循环从右向左计数,并且每隔一列跳过一次,将起始列声明为awk变量(以为我无法知道该怎么做)

感谢您解决这个问题。

肖恩·布莱特

当然,有更优雅的方法可以做到这一点,但我并不是一个真正的awk人:

第1部分:

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

输出:

[email protected]@1.5@[email protected]
[email protected]@4@[email protected]
[email protected]@.5@[email protected]
[email protected]@[email protected]@6
[email protected]@.5@[email protected]
[email protected]@10.5@[email protected]

第2部分:

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

输出:

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每一个中的文字都是您的“迭代次数”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章