Exibe a coluna que possui uma string específica

2

O conteúdo de um arquivo de amostra é o seguinte:

AA BB CC DD BB
1  2  3  4  9
5  6  7  8  10

Eu quero exibir as colunas inteiras que contêm BB e DD . No caso real, não sei quais colunas contêm as strings BB e DD . Além disso, será ótimo determinar a ordem das colunas que serão impressas.

A saída desejada é:

BB DD BB
2  4  9
6  8  10

Quando é dito que a coluna DD deve ser a primeira, a saída desejada é:

DD BB BB
4  2  9
8  6  10

A ordenação de colunas pode ser dada em uma string, por exemplo cols="BB, DD" .

O delimitador do arquivo de entrada pode mudar.

    
por Kadir 12.02.2014 / 06:00

1 resposta

5

Você pode ter problemas com cut se tiver vários espaços como o delimitador. Você poderia usar awk :

$ awk '{print $2, $4, $5}' OFS='\t' inputfile
BB      DD      BB
2       4       9
6       8       10

(Você pode fornecer o delimitador de entrada e saída usando FS e OFS , respectivamente.)

EDIT: De acordo com seus comentários, se os valores estiverem em colunas desconhecidas, você poderá dizer:

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

Para sua entrada, isso resultaria em:

BB      DD      BB
2       4       9
6       8       10

Funciona mantendo um registro das colunas na primeira linha que contêm BB ou DD e, em seguida, imprime essas colunas.

Se você pretende usar uma variável para armazenar os valores da coluna, pode declarar um como:

pattern="^BB$|^DD$"

(observe que as âncoras ^ & $ foram adicionadas para garantir que BB não corresponda a ABB e assim por diante. | é, novamente, um metacaractere de expressão correspondente a or )

e depois diga:

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
    
por 12.02.2014 / 06:07