示例文件的内容如下:
AA BB CC DD BB
1 2 3 4 9
5 6 7 8 10
Run Code Online (Sandbox Code Playgroud)
我想显示包含BB
和的整个列DD
。在实际情况下,我不知道哪些列包含字符串BB
和DD
. 此外,确定将打印的列的顺序会很棒。
所需的输出是:
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"
.
输入文件的分隔符可能会改变。
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)