两个文件的对应列相减
cat file1
ATOM 1 N ASP 1 104.872 46.138 60.493 1.00 0.00 N
ATOM 2 H1 ASP 1 105.169 46.143 60.702 1.00 0.00 H
ATOM 3 H2 ASP 1 105.241 46.250 60.447 1.00 0.00 H
ATOM 4 H3 ASP 1 105.174 45.965 60.473 1.00 0.00 H
ATOM 5 CA ASP 1 103.501 46.223 60.288 1.00 0.00 C
cat file2
ATOM 1 N ASP 1 104.307 46.895 65.756 1.00 0.00 N
ATOM 2 H1 ASP 1 104.961 47.329 65.120 1.00 0.00 H
ATOM 3 H2 ASP 1 104.636 45.956 65.926 1.00 0.00 H
ATOM 4 H3 ASP 1 104.324 47.367 66.649 1.00 0.00 H
ATOM 5 CA ASP 1 102.945 46.927 65.177 1.00 0.00 C
awk -vOFS='\t' 'NR==FNR{for(i=5;i++<NF;)a[FNR,i]=$i;next}{for(i=;i++<NF;)$i=$i-a[FNR,i]}2' file1 file2
得到的结果是后3列也被减掉
ATOM 1 N ASP 1 0.565 -0.757 -5.263 0 0 0
ATOM 2 H1 ASP 1 0.208 -1.186 -4.418 0 0 0
ATOM 3 H2 ASP 1 0.605 0.294 -5.479 0 0 0
ATOM 4 H3 ASP 1 0.85 -1.402 -6.176 0 0 0
ATOM 5 CA ASP 1 0.556 -0.704 -4.889 0 0 0
我希望的结果是
ATOM 1 N ASP 1 0.565 -0.757 -5.263 1.00 0.00 N
ATOM 2 H1 ASP 1 0.208 -1.186 -4.418 1.00 0.00 N
ATOM 3 H2 ASP 1 0.605 0.294 -5.479 1.00 0.00 N
ATOM 4 H3 ASP 1 0.85 -1.402 -6.176 1.00 0.00 N
ATOM 5 CA ASP 1 0.556 -0.704 -4.889 1.00 0.00 N
awk 'NR==FNR{for(i=5;i<=NF-3;i++) a[FNR,i]=$i; next}{for(i=5;i<=NF-3;i++) $i=a[FNR,i]-$i}1' file1 file2
ATOM 1 N ASP 0 0.565 -0.757 -5.263 1.00 0.00 N
ATOM 2 H1 ASP 0 0.208 -1.186 -4.418 1.00 0.00 H
ATOM 3 H2 ASP 0 0.605 0.294 -5.479 1.00 0.00 H
ATOM 4 H3 ASP 0 0.85 -1.402 -6.176 1.00 0.00 H
ATOM 5 CA ASP 0 0.556 -0.704 -4.889 1.00 0.00 C
你的AWK命令在处理文件时确实存在一些问题。你的目标是对两个文件的中间三列(第5、6、7列)进行相减操作,但是你的AWK命令似乎对所有的列都进行了操作。此外,你在AWK命令中使用了i++<NF
,这会导致你的循环从第1列开始,而不是从第5列开始。
为了只处理中间三列,并且保持其他列不变,你可以使用以下的AWK命令:
awk 'NR==FNR { for(i=1;i<=3;i++) a[FNR,i]=$i; next } { for(i=1;i<=3;i++) $i=$i-a[FNR,i]; print }' file1 file2
这个命令的工作原理如下:
file1
)时,它会将每行的前三列存储在数组a
中。file2
)时,它会从对应的行中取出数组a
中存储的值,并从当前行的前三列中减去这些值。注意,我移除了OFS='\t'
,因为默认的输出字段分隔符就是制表符。如果你确实需要改变它,你可以再次添加这个选项。
此外,由于你只修改了前三列,所以其他列(包括第4列到最后一列)将保持不变。因此,你应该能得到你期望的结果。
问题内容: 文件1具有5个字段ABCDE,其中字段A是整数 文件2具有3个字段AFG 文件1中的行数比文件2中的行数大得多(20 ^ 6到5000) 文件1中A的所有条目都出现在文件2中的A字段中 我喜欢按字段A合并两个文件并携带F和G 所需的输出是ABCDEFG 例 文件1 文件2 所需的输出 问题答案: $ awk ‘FNR==NR{a[$1]=$2 FS $3;next}{ print $0
我正在使用Hadoop 0.20.2,如果可能的话,我想使用-cat shell命令将两个文件连接成一个文件(来源:http://hadoop.apache.org/common/docs/r0.19.2/hdfs_shell.html) 这是我正在提交的命令(名称已更改): 它返回bash: /user/username/folder/outputdirectory/:没有这样的文件或目录 我还
问题内容: 将被转换成“输入”有用的“所需的输出”? 输入项 所需的输出 问题答案: 正确对齐的一个技巧是使用:
问题内容: 我有两个文件A1和A2(未排序)。A1是A2的早期版本,一些行已添加到A2。如何获得添加到A2的新行? 注意:我只想添加新行,而不想要A1中但在A2中删除的行。当我这样做时,我得到了添加和删除,但是我只想要添加。 请提出一种方法。 问题答案: 然后针对您想要的编辑类型。
我有两个文本文件file1.txt和file2.txt
问题内容: 我有一个包含多个数据结构的文件,如下所示: 我想找到所有有效载荷事件:SMS-MO-FSM或有效载荷:SMS-MO-FSM-INFO,发生在时间2010-03-23 12:56:47和2010-03-23 13之间: 56:47。到目前为止,当查询此文件时,我以以下方式使用了awk: 这将为我提供在2010-03-23 14:16:35的第二个事件发生的所有事件。但是,我正在努力思考如