【问题标题】:File Formatting : Confusion using awk NR Variable文件格式:混淆使用 awk NR 变量
【发布时间】:2011-10-29 22:08:03
【问题描述】:

我是 awk 编程的新手,对 NR 变量的使用有点困惑..

我的代码是...

awk 'BEGIN {k=NR;}{printf("%s %s %s %s\n",$k,$(k+1),$(k+2),$(k+3))}' auth_data

$ cat auth_data

6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 61
30 3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 

输出:

6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 6130
3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000  6262 6530 6661

但我想要的是输出应该是这种格式:

  6262 6530 6661 3162 6364 6264 6561 3430
  3033 3332 6536 3139 6230 6261 6130 3637 
  0A00 0000 0000 0000 0000 0000 0000 0000
  0000 0000 0000 0000 0000 0000 0000 0000 

【问题讨论】:

  • 对格式正确且合乎逻辑的问题投赞成票。继续努力,祝你好运!
  • @shelter 非常感谢先生.. 以后我会努力的

标签: linux bash shell awk


【解决方案1】:

我猜你要找的是 NF,而不是 NR。

来自手册页:

NR 到目前为止看到的输入记录总数。

NR 是实际的行号,但在这个问题中,你想对字段 idx 做一些技巧,而不是行。

另外,我认为您的输入数据应该在文件 'auth_data' 的一行中,对吧?

如果是这样,你可以试试

awk '{for(i=1;i<=NF;i++)if(i%8==0)print $i;else printf $i" "}' auth_data

检查下面的测试:

kent$  echo "6262 6530 6661 3162 6364 6264 6561 3430 3033 3332 6536 3139 6230 6261 6130 3637 0A00 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"|\
awk '{for(i=1;i<=NF;i++)if(i%8==0)print $i;else printf $i" "}'
    6262 6530 6661 3162 6364 6264 6561 3430
    3033 3332 6536 3139 6230 6261 6130 3637
    0A00 0000 0000 0000 0000 0000 0000 0000
    0000 0000 0000 0000 0000 0000 0000 0000

回到问题,如果你只是想做格式化,xargs 就足够了。见下文:

kent$  echo "6262 6530 6661 3162 6364 6264 6561 3430 3033\
        3332 6536 3139 6230 6261\
        6130 3637 0A00 0000 0000 \
        0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"|xargs -n8

输出:

6262 6530 6661 3162 6364 6264 6561 3430
3033 3332 6536 3139 6230 6261 6130 3637
0A00 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

你可以cat yourFile|xargs -n8xargs -n8 -a yourfile

【讨论】:

  • Thanx 之前甚至没有听说过xargs ....整个问题只用一行就解决了,我在我的代码中至少需要10 times。再次感谢!!!跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2016-01-14
  • 2012-06-26
  • 2011-04-30
  • 1970-01-01
  • 2012-02-24
  • 2012-08-26
相关资源
最近更新 更多