【发布时间】:2018-06-27 09:03:11
【问题描述】:
我有一个至少有 16 列(但可能更多)的制表符分隔文件,其中第一列是唯一标识符;和 >10,000 行(示例中仅显示 6x6),如下所示:
ID VAR1 VAR2 VAR3 VAR4 VAR5
1 1 1 1 1 1
2 -9 -9 -9 -9 -9
3 3 3 3 3 3
4 4 4 4 -9 4
5 5 5 5 5 5
6 6 -9 6 6 6
如果其中一个值已经是“-9”,我需要将 VAR1-5 的所有值更改为“-9”
因此,所需的输出将是:
ID VAR1 VAR2 VAR3 VAR4 VAR5
1 1 1 1 1 1
2 -9 -9 -9 -9 -9
3 3 3 3 3 3
4 -9 -9 -9 -9 -9
5 5 5 5 5 5
6 -9 -9 -9 -9 -9
到目前为止,我已经尝试在 awk 中这样做:
awk -F'\t' '
BEGIN{OFS="\t"}
{for(i=2;i<=NF;i++){if ($i=="-9"){for(j=2;j<=NF;j++){$j="-9"};continue}}};1
' < file1.tab
这很有效,但在应用于实际数据集时非常慢。有没有更快的方法来做到这一点?也许是grep 和sed 的组合?
【问题讨论】:
-
如果您已经在使用 Awk,它会做所有
sed和grep可以做的事情,而且通常更快。 -
VAR1-5 的所有值 - 它应该只处理前 5 列吗?
-
@RomanPerekhrest OP 自己的尝试似乎证实了它实际上应该替换所有列的怀疑。我更新了标题以反映这一点,所以如果这是一个不正确的解释,请回滚。