文件包含: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、3a
is 3、1 2
is 1、3.4.5.6
is 3.4 等等。 (在行首按Ctrl+表示输入结束并退出,或者直接按+ 。)Dawk
CtrlC
根据您实际想要执行的操作,您也许能够编写一个更简单的命令,该命令更清楚地说明其功能和工作原理,并且可以更轻松地进行修改。例如,如果每个文件只有两列由空格分隔,并且条目本身不包含空格,只需通过运行paste
without -d
(或者,如果您愿意,使用类似-d ' '
)将它们合并到一个四列表中,并通过管道处理表它awk
没有-F
:
paste File1 File2 | awk '{print $1 - $3}'
然后,当数字出现在字母之后而不是之前时,如何调整 AWK 脚本就变得显而易见了:
paste File3 File4 | awk '{print $2 - $4}'
(要对此进行测试,您可以通过使用 切换列来分别makeFile3
和File4
fromFile1
和。例如,make 。)File2
awk
awk '{print $2, $1}' File1 > File3
File3