我有 2 个文件,第一行是标题行供参考
file1
userId userContact parentId parentContact 200 0900200 100 - 201 0900201 100 - 300 0900300 101 -
file2
userId userContact parentId parentContact 100 0900100 100 - 101 0900101 100 -
我想填充 的第 4 列file1
,以便它必须搜索in $3
of ,然后将from代替 of ,
因此输出应如下所示:file1
$1
file2
$2
file2
$4
file1
output
userId userContact parentId parentContact 200 0900200 100 0900100 201 0900201 100 0900100 300 0900300 101 0900101
我更喜欢awk
,因为它会更快。
使用
join
(它需要排序的输入文件,所以我们传递了排序的输入)。使用
-1 3
, join从第一个输入文件 (file1) 中选择第 3 列作为键,并从第二个输入文件 (file2) 中选择第1-2 1
列作为键;然后它输出这些列<file#>.<column#>。-o
如果您的输入是制表符分隔的文件,请添加
-t$'\t'
到 join 命令以及sort -k3 file1
.如果您想打印标题行,请
head -n1 file1;
在连接之前添加。或使用
awk
:这读入,将每行的字段 2 存储在一个名为(由字段 1 的值索引)
file2
的数组中。keep
一旦它读完file2
,它就开始读file1
。它打印第一行(标题行),然后对于每个后续输入行,它将字段 4 更改为 in 的值keep[$3]
并打印它。file2
该脚本通过测试检测它是否正在读取NR==FNR
。awk 的FNR
变量包含当前文件的当前行号,而NR
包含到目前为止读取的所有文件的累积总行号。因此,如果 FNR 等于 NR,我们正在读取第一个文件(即file2
- 这就是它必须列为第一个文件名 arg 的原因)。在一些相当模糊的情况下,这个测试不能很好地工作,但在大多数情况下(包括这个)都可以。如果需要更改输入或输出字段分隔符,可以使用 awk 的 -F 和 -v 选项。例如
-F'\t'
和/或-v OFS='\t'
。