显示具有特定字符串的列

Kad*_*dir 2 grep cut columns

示例文件的内容如下:

AA BB CC DD BB
1  2  3  4  9
5  6  7  8  10
Run Code Online (Sandbox Code Playgroud)

我想显示包含BB和的整个列DD。在实际情况下,我不知道哪些列包含字符串BBDD. 此外,确定将打印的列的顺序会很棒。

所需的输出是:

BB DD BB
2  4  9
6  8  10
Run Code Online (Sandbox Code Playgroud)

当说DD列必须在前时,所需的输出是:

DD BB BB
4  2  9
8  6  10
Run Code Online (Sandbox Code Playgroud)

列顺序可以在字符串中给出,例如cols="BB, DD".

输入文件的分隔符可能会改变。

dev*_*ull 5

cut如果您有多个空格作为分隔符,您可能会遇到问题。你可以使用awk

$ awk '{print $2, $4, $5}' OFS='\t' inputfile
BB      DD      BB
2       4       9
6       8       10
Run Code Online (Sandbox Code Playgroud)

(您可以分别使用FS和提供输入和输出分隔符OFS。)


编辑:根据您的评论,如果值在未知列中,您可以说:

awk 'NR==1{for(i=1; i<=NF; i++) if ($i=="BB" || $i=="DD") {a[i]++;} } { for (i in a) printf "%s\t", $i; printf "\n"}' filename
Run Code Online (Sandbox Code Playgroud)

对于您的输入,它会导致:

BB      DD      BB
2       4       9
6       8       10
Run Code Online (Sandbox Code Playgroud)

它的工作原理是跟踪第一行中包含BB或的列DD,然后打印出这些列。

如果您打算使用一个变量来存储列值,您可以像这样声明一个:

pattern="^BB$|^DD$"
Run Code Online (Sandbox Code Playgroud)

(请注意,已添加锚点^&$以确保BB不匹配ABB等。同样 |是一个正则表达式元字符,表示or

然后说:

awk -vp="$pattern" 'NR==1{for(i=1; i<=NF; i++) if ($i~p) {a[i]++;} } { for (i in a) printf "%s\t", $i; printf "\n"}' filename
Run Code Online (Sandbox Code Playgroud)