awk 查找 table,空白列替换
awk lookup table, blank column replacement
我正在尝试使用查找 table 来搜索和替换两个特定的列,并不断得到一个空白列作为输出。我遵循了在堆栈中找到的几个查找 table 示例的语法,但没有任何乐趣。这是每个文件的片段。
示例查找 table -- 想要在我的数据文件中搜索第 1 列的实例,并将它们替换为第 2 列中的相应值(第一行是 header):
#xyz type
N 400
C13 401
13A 402
13B 402
13C 402
C14 405
要替换的源文件格式如下:
1 N 0.293000 2.545000 16.605000 0 2 6 10 14
2 C13 0.197000 2.816000 15.141000 0 1
3 13A 1.173000 2.887000 14.676000 0
4 13B -0.319000 3.756000 14.937000 0
5 13C -0.351000 1.998000 14.678000 0
6 C14 0.749000 3.776000 17.277000 0 1
查找的第 2 列中的相应值 table 将替换我的源文件第 6 列中的值(当前全为零)。这是我认为应该工作的 awk one-liner:
awk -v OFS='\t' 'NR==1 { next } FNR==NR { a[]=; next } in a { =a[] }1' lookup.txt source.txt
但我的输出基本上删除了第 6 列的整个条目:
1 N 0.293000 2.545000 16.605000 2 6 10 14
2 C13 0.197000 2.816000 15.141000 1
3 13A 1.173000 2.887000 14.676000
4 13B -0.319000 3.756000 14.937000
5 13C -0.351000 1.998000 14.678000
6 C14 0.749000 3.776000 17.277000 1
(第六列应该是 400 到 405。我考虑过使用 sed,但是我在查找 table 的源和输出列中有重复的值,所以在这种情况下不起作用。令人沮丧的是,前一周我让这个 one-liner 处理几乎完全相同的源文件,但现在只能得到这种行为。我希望能够修改我的 awk 调用以查找两个不同的同时列,但现在想从简单的开始。谢谢!
您的脚本中有 =a[]
而不是 =a[]
。
$ awk -v OFS='\t' 'NR==FNR{map[]=; next} {=map[]} 1' file1 file2
1 N 0.293000 2.545000 16.605000 400 2 6 10 14
2 C13 0.197000 2.816000 15.141000 401 1
3 13A 1.173000 2.887000 14.676000 402
4 13B -0.319000 3.756000 14.937000 402
5 13C -0.351000 1.998000 14.678000 402
6 C14 0.749000 3.776000 17.277000 405 1
我正在尝试使用查找 table 来搜索和替换两个特定的列,并不断得到一个空白列作为输出。我遵循了在堆栈中找到的几个查找 table 示例的语法,但没有任何乐趣。这是每个文件的片段。
示例查找 table -- 想要在我的数据文件中搜索第 1 列的实例,并将它们替换为第 2 列中的相应值(第一行是 header):
#xyz type
N 400
C13 401
13A 402
13B 402
13C 402
C14 405
要替换的源文件格式如下:
1 N 0.293000 2.545000 16.605000 0 2 6 10 14
2 C13 0.197000 2.816000 15.141000 0 1
3 13A 1.173000 2.887000 14.676000 0
4 13B -0.319000 3.756000 14.937000 0
5 13C -0.351000 1.998000 14.678000 0
6 C14 0.749000 3.776000 17.277000 0 1
查找的第 2 列中的相应值 table 将替换我的源文件第 6 列中的值(当前全为零)。这是我认为应该工作的 awk one-liner:
awk -v OFS='\t' 'NR==1 { next } FNR==NR { a[]=; next } in a { =a[] }1' lookup.txt source.txt
但我的输出基本上删除了第 6 列的整个条目:
1 N 0.293000 2.545000 16.605000 2 6 10 14
2 C13 0.197000 2.816000 15.141000 1
3 13A 1.173000 2.887000 14.676000
4 13B -0.319000 3.756000 14.937000
5 13C -0.351000 1.998000 14.678000
6 C14 0.749000 3.776000 17.277000 1
(第六列应该是 400 到 405。我考虑过使用 sed,但是我在查找 table 的源和输出列中有重复的值,所以在这种情况下不起作用。令人沮丧的是,前一周我让这个 one-liner 处理几乎完全相同的源文件,但现在只能得到这种行为。我希望能够修改我的 awk 调用以查找两个不同的同时列,但现在想从简单的开始。谢谢!
您的脚本中有 =a[]
而不是 =a[]
。
$ awk -v OFS='\t' 'NR==FNR{map[]=; next} {=map[]} 1' file1 file2
1 N 0.293000 2.545000 16.605000 400 2 6 10 14
2 C13 0.197000 2.816000 15.141000 401 1
3 13A 1.173000 2.887000 14.676000 402
4 13B -0.319000 3.756000 14.937000 402
5 13C -0.351000 1.998000 14.678000 402
6 C14 0.749000 3.776000 17.277000 405 1