我有一个数据框,其中包含>100个列,每个列都用一个唯一的字符串标记。列1表示索引变量。我想使用一个基本的UNIX命令提取索引列 *(列1)+一个特定的列字符串 * 使用grep
。
例如,如果我的数据框看起来像下面这样:
Index A B C...D E F
p1 1 7 4 2 5 6
p2 2 2 1 2 . 3
p3 3 3 1 5 6 1
我想使用一些命令来提取列“X”,我将指定与grep
,并显示列1和列I grep
'd。我知道我可以使用cut -f1 myfile
作为第一位,但需要帮助每列的grep
。举一个更具体的例子,如果我的grep
短语是“B”,我希望输出是:
Index B
p1 7
p2 2
p3 3
我是UNIX新手,没有发现很多类似的例子。如有任何帮助,我们将不胜感激!!
3条答案
按热度按时间x4shl7ld1#
使用awk:
这个简单的命令允许打印文件的第一列($1)和第三列($3)。awk软件实际上要强大得多。我想你应该看看awk的手册页。
一个很好的组合是使用grep和awk与管道。下面的代码将只打印文件中包含'p1'的行的第1列和第3列:
相反,如果你想通过行号选择行,你可以用sed代替grep:
实际上,awk可以在所有示例中单独使用:
6ovsh4lw2#
首先找出命令来查找列号。
一旦你知道了数字,就用cut
将合并合并为一个命令
完成了吗?不,当一个头可以是另一个头的子字符串时,你应该改进第一个
sed
命令:在匹配中包含制表符,并将制表符放回替换字符串中。oaxa6hgo3#
如果你想保留第一列和第一行中包含特定字符串的列(例如,
B
),那么这个应该可以工作。它假设你的字符串只出现一次。可能有一个更好的解决方案与惊人的awk,但这应该工作。
解释:在第一行(NR==1)中,它遍历所有列(i=1; i<=NF;i++)直到找到字符串,保存列号,然后打印它。如果你想把字符串作为变量传递,那么你可以使用-v选项。