我需要使用像这样的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.
答案 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
),并仅在值相等时执行以下操作({...}
)。
{ $ndx = NR }
将当前(从1开始)行索引(NR
)分配给索引为ndx
的字段,使用新字段值有效地重建输入行。
1
是简单地打印(可能修改的)输入行的常用简写。 (1
实际上等同于{ print }
:模式1
总是计算为true,并且由于它没有关联的操作,因此默认操作会启动,即只打印该行。)
答案 1 :(得分:2)
你的问题并不完全清楚
在awk中,内置变量NF
和NR
分别表示每行中的字段数和记录/行号。
要从给定输入获得所需的输出,我会执行以下操作:
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