Obtendo apenas dados específicos com base no nome no arquivo de texto

2

Digamos que meu arquivo de texto contenha:

101    Adam
201    Clarie
502    Adam
403    Tom

e eu quero escrever um comando no shell para me dar apenas os números baseados em um nome específico. Por exemplo, apenas a saída do número para o nome 'Adam' daria:

101
502

Eu estava pensando em algo como:

cut -f 1 Data_1 | grep "Adam"

mas não funciona. Data_1 é o nome do arquivo. 1 refere-se à primeira coluna. Eu sou novo no Unix, então vou apreciar alguns comentários sobre isso.

    
por Electric 14.10.2017 / 08:25

4 respostas

2

Primeiro você tem a ordem de grep / cut backwards. E, a menos que sejam abas reais (como na Aba ), você também precisa especificar que o espaço em branco normal (como em Espaço ) é seu delimetro.

grep Adam Data_1 | cut -f1 -d' '

Se você estiver usando guias, desative -d' ' .

De um modo geral, tente uma coisa de cada vez enquanto constrói um comando composto como este. O que você vê quando faz cut sozinho? Parece que aplicar grep faz sentido? Se não, repensar as coisas.

E sempre dá uma boa leitura à página man de cada comando.

Bônus : aqui está um comando sed para fazer a mesma coisa:

sed -n 's/^\(.*\)\t\+Adam$//p' Data_1

Isso passa por cada linha no arquivo, mas imprime somente aquelas que terminam com uma ou mais guias e sua string de pesquisa. Então, antes de imprimir, remove as mesmas guias e a string de pesquisa.

    
por 14.10.2017 / 08:30
3

Você pode usar a porcentagem grep única com a extensão perl em busca da extensão por meio da opção -P :

grep -Po '.*(?=Adam)' file

Isso imprimirá tudo na linha até a palavra Adam.

Se você quiser apenas números, excluindo espaços em branco, etc:

grep -Po '[0-9]*(?=.*Adam)' file
    
por 14.10.2017 / 08:38
3

Sugerimos usar awk para isso

  • O separador de campo de entrada padrão é um ou mais espaços em branco consecutivos, portanto não é necessário se preocupar com espaços / separações de guias
  • É mais fácil comparar strings fixas (ou seja, menos propensas a metacaracteres regex - precisa ter cuidado ao construir strings com aspas e o caractere de barra invertida. Veja também Sequências de escape )


$ cat ip.txt
101    Adam
201    Clarie
502    Adam
403    Tom

$ # check if 2nd column value is Adam (wont match MAdam, Adama, etc)
$ # use $NF instead of $2 to check against last column
$ awk '$2=="Adam"{print $1}' ip.txt
101
502

$ # using variable instead of string constant
$ awk -v name='Adam' '$2==name{print $1}' ip.txt
101
502

$ # passing shell variable
$ n='Tom'
$ awk -v name="$n" '$2==name{print $1}' ip.txt
403
    
por 14.10.2017 / 11:48
2

Abordagem simples com Awk:

awk '/ Adam$/ {print $1}' file                                             
101
502
    
por 14.10.2017 / 09:02