我有一个数据框,其中包含> 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
Run Code Online (Sandbox Code Playgroud)
我想使用一些命令仅提取我将用指定的“ X”列grep,并同时显示第1列和第grepd 列。我知道我可以cut -f1 myfile在第一篇文章中使用,但需要grep每列的帮助。作为一个更具体的示例,如果我的grep短语是“ B”,我希望输出为:
Index B
p1 7
p2 2
p3 3
Run Code Online (Sandbox Code Playgroud)
我是UNIX的新手,在类似示例中找不到很多东西。任何帮助将非常感激!!
您需要使用awk:
awk '{print $1,$3}' <namefile>
Run Code Online (Sandbox Code Playgroud)
这个简单的命令允许打印文件的第一($ 1)和第三($ 3)列。实际上,awk软件功能更强大。我认为您应该看看awk的手册页。
一个不错的组合是通过管道使用grep和awk。以下代码将仅显示文件中包含“ p1”的行的第1列和第3列:
grep 'p1' <namefile> | awk '{print $1,$3}'
Run Code Online (Sandbox Code Playgroud)
相反,如果要按行号选择行,则可以用sed替换grep:
sed 1p <namefile> | awk '{print $1,$3}'
Run Code Online (Sandbox Code Playgroud)
实际上,awk可以在所有示例中单独使用:
awk '/p1/{print $1,$3}' <namefile> # will print only lines containing p1
awk '{if(NR == 1){print $1,$3}}' <namefile> # Will print only first line
Run Code Online (Sandbox Code Playgroud)
首先找出命令以查找列号。
columnname=C
sed -n "1 s/${columnname}.*//p" datafile | sed 's/[^\t*]//g' | wc -c
Run Code Online (Sandbox Code Playgroud)
一旦知道号码,就使用cut
cut -f1,3 < datafile
Run Code Online (Sandbox Code Playgroud)
合并为一个命令
cut -f1,$(sed -n "1 s/${columnname}.*//p" datafile |
sed 's/[^\t*]//g' | wc -c) < datafile
Run Code Online (Sandbox Code Playgroud)
做完了吗 不,sed当一个标头可以是另一个标头的子字符串时,您应该改进第一个命令:在您的匹配项中包含制表符,然后将制表符放回替换字符串中。
| 归档时间: |
|
| 查看次数: |
39118 次 |
| 最近记录: |