您好,我有一个数据文件,我需要在第 6 列和第 8 列中找到最小值(大于 0),并获得后续的第 7 列或第 9 列
原始数据:
1003 04 10 2 2 **1172** *2140* 1179 2140
1003 04 14 4 0 1162 2140 **1161** *1640*
1003 04 9 1 1 **1152** 1640 1157 1640
1004 04 5 0 **1190** *2140* 0 0
1004 04 10 1 0 **1184** *2160* 0 0
1004 04 9 1 0 **1171** *1640* 1198 2140
1006 04 10 3 1 **1157** *2140* 1168 1640
1006 04 9 3 1 0 0 **1149** *1640*
1006 04 2 0 0 1171 2160 **1160** *1640*
1007 04 4 0 0 **1199** *2140* 0 0
1007 04 20 3 3 **1164** *2140* 1197 2140
1007 04 7 0 0 0 0 **1185** *2140*
预期产出
1003 04 10 2 2 1172 2140
1003 04 14 4 0 1161 1640
1003 04 9 1 1 1152 1640
1004 04 5 0 1190 2140
1004 04 10 1 0 1184 2160
1004 04 9 1 0 1171 1640
1006 04 10 3 1 1157 2140
1006 04 9 3 1 1149 1640
1006 04 2 0 0 1160 1640
1007 04 4 0 0 1199 2140
1007 04 20 3 3 1164 2140
1007 04 7 0 0 1185 2140
答案1
$ awk '($8 > 0 && $8 < $6) || ($6 == 0) { $6 = $8; $7 = $9 }; 1' file | cut -d ' ' -f 1-7
1003 04 10 2 2 1172 2140
1003 04 14 4 0 1161 1640
1003 04 9 1 1 1152 1640
1004 04 5 0 1190 2140 0
1004 04 10 1 0 1184 2160
1004 04 9 1 0 1171 1640
1006 04 10 3 1 1157 2140
1006 04 9 3 1 1149 1640
1006 04 2 0 0 1160 1640
1007 04 4 0 0 1199 2140
1007 04 20 3 3 1164 2140
1007 04 7 0 0 1185 2140
如果第 6 列为零或第 8 列大于零且小于第 6 列,则将用第 8 列和第 9 列覆盖第 6 列和第 7 列。
然后使用该命令的结果awk
将其修剪为七列cut
。
0
请注意,输入数据的第四行包含的列太少(它可能缺少第四或第五列),这就是为什么与问题中的预期结果相比,我的结果似乎有额外的内容。如果我们将结果传递给column -t
:
1003 04 10 2 2 1172 2140
1003 04 14 4 0 1161 1640
1003 04 9 1 1 1152 1640
1004 04 5 0 1190 2140 0
1004 04 10 1 0 1184 2160
1004 04 9 1 0 1171 1640
1006 04 10 3 1 1157 2140
1006 04 9 3 1 1149 1640
1006 04 2 0 0 1160 1640
1007 04 4 0 0 1199 2140
1007 04 20 3 3 1164 2140
1007 04 7 0 0 1185 2140