删除包含特定字符串的文本文件中的列

3

我希望删除一个以特定字符串“Gtype”开头的.txt制表符分隔文件中的列。我已经在R中尝试了这个命令:df <- df[, -grep("GType.", colnames(df))]来完成此任务。但是我的矩阵太大了(超过13 GB),R无法处理它。(错误:无法分配大小为...的向量)

我的输入文件:

Log.NE122  Gtype.NE122  Log.NE144    Gtype.NE144
-0.33          AA          1.0           AB

My expected output:

   Log.NE122  Log.NE144  
    -0.33       1.0      

我想知道它在bash中是否可行。如果有其他选项,请告诉我...


“Gtype”只出现在第一行吗? - a5hk
是的,I R它是表的头。 - user3091668
2个回答

2

使用 awk:

awk 'NR==1{for (i=1; i<=NF; i++) if ($i ~ /Gtype/) a[i]; 
     else printf "%s%s", $i, OFS; print ""; next}
     {for (i=1; i<=NF; i++) if (!(i in a)) printf "%s%s", $i, OFS; print "" }' file
Log.NE122 Log.NE144
-0.33     1.0

嗨,Anubhava,我有一个几乎相似的问题。我的字符串可能是这样的 RT12-ABS-NSA 或者像这样 ADM_THO_CVL2000。然而,当我更改你脚本中寻找该字符串的部分时,什么都没有发生。你有任何线索吗?为什么会这样? - Andy K
@AndyK:没有看到你的样本数据和期望结果,很难提出建议。如果可能的话,我建议创建一个问题,并提供所有相关细节。 - anubhava
抱歉,Anubhava。您的解决方案有效。我已经根据我的需求进行了修改。awk -F";" 'NR==1{for (i=1; i<=NF; i++) if ($i ~ /Gtype/) a[i]; else printf "%s%s", $i, OFS; print ""; next} {for (i=1; i<=NF; i++) if (!(i in a)) printf "%s%s", $i, OFS; print "" }'但它会删除我的分号并给我空格。 - Andy K
我的问题在这里。请问您能否看一下? http://stackoverflow.com/questions/23134450/remove-columns-with-string-match-bash? - Andy K
@anubhava,你需要在这里指定FSOFS吗? - DSTO
1
默认的FS和OFS是一个或多个空格或制表符。在这个问题中,从问题中可以看出默认值会很好地工作。 - anubhava

2
您可以尝试使用“data.table”包并将列指定为NULL:
dt <- data.table(df)
dt[, colToDelete := NULL]

"data.table"试图在大部分操作中避免复制数据。而你现在使用的方式会导致需要进行数据复制。


setDT(df) 通过引用转换,阻止了甚至将 data.frame 复制到 data.table 的可能性。setDT(df)[, col_to_delete := NULL] - Arun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接