根据编号将行号分配给其中一个字段。每行中的字段

时间:2016-05-26 13:49:00

标签: linux unix awk

我需要使用像这样的awk命令来操作我的一个数据文件。我怎样才能用awk实现这个目标?任何输入将不胜感激。谢谢。

1) Get the no. of fields for each row.
   (a) If the count_of_fields = 'x' then assign a value to nth field in each row.

输入 : -

1,x,A,B
2,A,B,C
3,x,C,D
4,D,E,F,G
5,x,E,F

**

输出

**: -

1,1,A,B
2,A,B,C
3,3,C,D
4,D,E,F,G
5,5,E,F

x- is the 2nd column where I would like to assign NR when NF=4
n - This is the 2nd column.

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

awk -v count=4 -v ndx=2 'BEGIN { FS=OFS="," } NF==count { $ndx = NR } 1' file

如果仅在原始值为x时才更换第二个字段(与样本输出一致):

awk -v count=4 -v ndx=2 'BEGIN { FS=OFS="," } NF==count && $ndx=="x" { $ndx = NR } 1' file
  • -v count=4 -v ndx=2

    将所需的字段数量awk变量count传递给awk脚本,将目标字段的索引传递为变量ndx

  • BEGIN { FS=OFS="," }

    仅执行一次,在脚本的其余部分之前,设置输入字段分隔符(FS)和输出字段分隔符到,,以便awk按逗号分隔输入到字段中,并在更改字段值后重建行时使用逗号作为分隔符。 谢谢,Ed Morton

  • NF==count

    是一种模式,它针对NF变量测试字段计数(count),并仅在值相等时执行以下操作({...})。

    < / LI>
  • { $ndx = NR }

    将当前(从1开始)行索引(NR)分配给索引为ndx的字段,使用新字段值有效地重建输入行。

  • 1

    是简单地打印(可能修改的)输入行的常用简写。 (1实际上等同于{ print }:模式1总是计算为true,并且由于它没有关联的操作,因此默认操作会启动,即只打印该行。)

答案 1 :(得分:2)

你的问题并不完全清楚 在awk中,内置变量NFNR分别表示每行中的字段数和记录/行号。

要从给定输入获得所需的输出,我会执行以下操作:

awk 'BEGIN{OFS=FS=","}$2=="x"{$2=NR}1' test.txt

这会将第二列中的每个x替换为行号:

1,1,A,B
2,A,B,C
3,3,C,D
4,D,E,F,G
5,5,E,F

更新:如果您希望在字段数等于4时用NR替换第二列的内容:

awk 'BEGIN{OFS=FS=","}NF==4{$2=NR}1' test.txt

输出:

1,1,A,B
2,2,B,C
3,3,C,D
4,D,E,F,G
5,5,E,F