【问题标题】:AWK Lookup between columns in the same file(similar to vlookup)AWK 在同一文件中的列之间查找(类似于 vlookup)
【发布时间】:2015-02-07 20:38:59
【问题描述】:

我有一个输入文件。 我需要扫描第 3 列中第 1 列和第 2 列的值/数字,如果匹配打印 $1 和 $2 与相应的 $4,输出如下所示。 任何帮助表示赞赏。

为了匹配 $3 中的第一列,尝试了这段代码,但没有成功。 逻辑是将 $3 放入一个数组并在其中扫描 $1。

awk -F ',' '{a[$3] } { if ($1 in a) {print $1":" $4 } else {print $1, "NA"}  }' 1.csv

输入

 345,1314,567,index-1
 344,1315,566,index-2
 343,1316,565,index-3
 342,1317,1316,index-4
 241,1318,563,index-5
 340,1319,562,index-6
 439,1320,561,index-7
 318,1333,337,index-8
 337,1335,559,index-9
 236,1336,558,index-10
 ,,311,index-11
 ,,1314,index-12
 ,,1333,index-13
 ,,3444,index-14
 ,,344,index-15
 ,,2008,index-16
 ,,342,index-17
 ,,1320,index-18
 ,,543,index-19
 ,,340,index-20
 ,,12233,index-21

输出

 345:#N/A
 344:index-15
 343:#N/A
 342:index-17
 241:#N/A
 340:index-20
 439:#N/A
 318:#N/A
 337:index-8
 236:#N/A
 1314:index-12
 1315:#N/A
 1316:index-4
 1317:#N/A
 1318:#N/A
 1319:#N/A
 1320:index-18
 1333:index-13
 1335:#N/A
 1336:#N/A

【问题讨论】:

  • 您的文字和您的示例不一致。请说明你想要什么,并展示你到目前为止所做的尝试。
  • 对不起,解释的混乱,示例输入和输出是有效的。我试图在开始时匹配第一列,但仍然需要很大的帮助。awk -F ',' '{a[$3] } { if ($1 in a) {print $1 $4 ":"} else {print $1, "NA"} }' 1.csv
  • 你试过什么?当您不包含代码时,很难帮助您编写代码。 Put it in your question,不仅仅是评论。

标签: awk lookup


【解决方案1】:
$ cat nash.awk
NR == FNR { a[$3] = $4; next }    
($1 in a) { print $1 ":" a[$1] }  
($2 in a) { print $2 ":" a[$2] }
$1 && !($1 in a) { print $1 ": #N/A"}    
$2 && !($2 in a) { print $2 ": #N/A"}

请注意,我们提供了两次文本文件,因为 awk 脚本进行了两次传递(请参阅下面的更多说明):

$ awk -F, -f nash.awk nash.txt nash.txt

1314:index-12
345: #N/A
344:index-15
1315: #N/A
1316:index-4
343: #N/A
342:index-17
1317: #N/A
241: #N/A
1318: #N/A
340:index-20
1319: #N/A
1320:index-18
439: #N/A
1333:index-13
318: #N/A
337:index-8
1335: #N/A
236: #N/A
1336: #N/A

解释:

NR == FNR { a[$3] = $4; next }

当 NR == FNR 时,我们知道我们正在第一次读取文件。这里我们保存了与$3 对应的所有$4 值。 next 表示我们跳过所有进一步的命令。

($1 in a) { print $1 ":" a[$1] }

如果我们在这里,我们知道我们正在第二次读取文件。检查字段 1 是否与任何字段 3 匹配,如果匹配,则将其与上述步骤中保存的字段 4 一起打印。

($2 in a) { print $2 ":" a[$2] }

同上,但对于第二个字段。

$1 && !($1 in a) { print $1 ": #N/A"}    

同样,如果第一个字段没有找到,则打印 N/A 消息。

$2 && !($2 in a) { print $2 ": #N/A"}

第二个字段同上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多