awk 从 2 个文件计算管道粘贴 -d

awk 从 2 个文件计算管道粘贴 -d

文件包含:File1

1 a
2 b
3 c
...

-------------------文件2

2 a
2 c
2 d
...

awk 接收以下格式,以逗号分隔:

1 a,2 a
2 b,2 c
...

paste -d, File1 File2 | awk -F, '{n=NF/2;s=""; for (i=1;i<=n;i++){printf "%s%s", s, ($i-$(i+n));s=",";}; print ""}'

我用这条线对第一个字段逐行进行差异;第一行是 1-2 所以打印 -1

好吧,这一切都很好,我得到了正确的答案,但我仍然不明白当字段由 -F 分隔时它如何拾取数字字段,代表

1 a

如果我改变

1 a 

a 1

对其余的做同样的事情是行不通的,我在逻辑上同意这一点。那么,换句话来说,当字段是数字和字母时,它是如何获取数字的呢? $i = 数字,为什么不是字母呢?

答案1

当字段是数字和字母时,如何获取数字?

,你的字段分隔符(-F,)、类似的文本2 a是单个字段时,当它用作数字时,它被简单地视为数字2。

当您要求 AWK 语言将字符串视为数字时,它是非常宽松的。它读取字符串,直到它作为数字不再有意义。到那时,如果有什么有意义的话,那就是你的号码。否则将其视为 0。当您在算术表达式中使用字符串时,这一切都会自动发生。要查看它是如何工作的,请运行:

awk '{print $0 + 0}'

$0是整条线。添加零会强制将其解释为数字,但不会改变该数字是什么。然后您可以键入输入行以查看如何awk将它们视为数字。例如,您会发现空字符串是 0、3ais 3、1 2is 1、3.4.5.6is 3.4 等等。 (在行首按Ctrl+表示输入结束并退出,或者直接按+ 。)DawkCtrlC


根据您实际想要执行的操作,您也许能够编写一个更简单的命令,该命令更清楚地说明其功能和工作原理,并且可以更轻松地进行修改。例如,如果每个文件只有两列由空格分隔,并且条目本身不包含空格,只需通过运行pastewithout -d(或者,如果您愿意,使用类似-d ' ')将它们合并到一个四列表中,并通过管道处理表它awk没有-F

paste File1 File2 | awk '{print $1 - $3}'

然后,当数字出现在字母之后而不是之前时,如何调整 AWK 脚本就变得显而易见了:

paste File3 File4 | awk '{print $2 - $4}'

(要对此进行测试,您可以通过使用 切换列来分别makeFile3File4fromFile1和。例如,make 。)File2awkawk '{print $2, $1}' File1 > File3File3

相关内容