我是 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
最佳答案
我猜你要找的是 NF,而不是 NR。
来自手册页:
NR The total number of input records seen so far.
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 -n8
或xargs -n8 -a yourfile
关于linux - 文件格式 : Confusion using awk NR Variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941997/