使用 bash shell 命令从另一个文件的列替换文件中的值列的最快方法?



我正在尝试通过从另一个值的列中替换文件中的某些列值来完成一项简单的工作,例如,我想替换 file1 中的两列,假设第 2 列和第 3 列由 file2 中的值替换。因此,预期的输出将是这样的:文件3

文件1:

1 2 3 4
1 2 3 4
1 2 3 4

文件2:

5 6
5 6
5 6

文件3:

1 5 6 4
1 5 6 4
1 5 6 4

所以我目前的解决方案是使用 awk:

awk 'NR==FNR{a[NR]=$1;b[NR]=$2;next}{$2=a[FNR];$3=b[FNR]}1' File2 File1>File3

但我觉得如果我有一百万行,它可能太慢了,因为每次我都必须逐行扫描文件 1 和文件 2 以恢复或调用我在 awk 中创建的数组。 由于 File1 和 File2 的长度相似,我想知道我是否可以做一些事情,比如将 File2 的值作为变量传递并直接替换它。 我尝试了类似的东西:

F2_col1=`awk '{print $1}' File2`
F2_col2=`awk '{print $2}' File2`
awk -v F2_col_v1=$F2_col1 -v F2_col_v2=$F2_col2 '{$2=F2_col_v1;$3=F2_col_v2;print }'File1 >File3

但它会引发一个错误,指出无法读取文件 5。尝试将 File2 的值作为单个文件读取似乎很尴尬?我想知道如何正确操作?或者有没有其他更快的方法来做到这一点。我只关心计算时间,所以欢迎任何建议(不限于awk(。

由于您指定它不必严格awk,我的建议是合并文件并仅打印选定的列:

file1=$1
file2=$2
paste "${file1}" "${file2}" | awk '{print $1" "$5" "$6" "$4}' >file3.txt

您的awk变量没有被引号,例如

awk -v F2_col_v1="$F2_col1" -v F2_col_v2="$F2_col2" ...

第一个外壳变量扩展到-v F2_col_v1=5 5 5.但我不知道将这些变量与有意义的awk结合起来的方法。

共同的cutpaste方法是

paste -d' ' <(cut -d' ' -f1 File1) file2 <(cut -d' ' -f4 File1) > File3

如果两个输入文件中的行数相同。

您必须测试这两种变体并停止时间。如果awk更快,我不会感到惊讶,因为File1被读取两次。

最新更新