awk não está correspondendo corretamente

1

Eu estou tentando awk um arquivo que contém uma lista de nomes mapeados para DOB no formato DD-MM.

A partida não funcionou na tentativa 1), então tentei executá-la na linha de comando conforme a tentativa 2), mas isso ainda não funcionou. Alguma sugestão?

Obrigado

file.txt
jason 08-04

TENTATIVA 1

XXXXXX$ cat a.txt
#!/bin/bash

file="file.txt"

current_date=$(date +%d-%m)
awk -F" ", 'if ($2==$current_date) print $1)' "$file"

TENTATIVA 2

awk -F" ", '{
if ($2=='08-04')
   print "$1"
}' file.txt
    
por user 08.04.2018 / 07:28

2 respostas

3

Alguns problemas em ambas as tentativas :

Tentativa nº 1 :

  • a variável $current_date não foi interpolada entre aspas simples
  • vírgula mal colocada após o separador de campos awk -F" ", < -
  • tente usar o operador if fora dos delimitadores de ação do awk { ... } - lançará syntax error ...

Tentativa nº 2 :

  • vírgula mal colocada após o separador de campos awk -F" ", < -
  • cotação única quebrada '...'08-04'...'

O caminho certo (passando uma variável para o comando awk como argumento):

awk -v d="$curr_date" '$2==d{ print $1 }' "$file"
    
por 08.04.2018 / 07:39
1

Para a tentativa 1, você precisará usar aspas duplas para a variável a ser expandida pelo shell, mas isso causará problemas com itens como $1 . Eu sugiro reescrevê-lo assim:

awk -v current_date="$(date +%d-%m)" '$2 == current_date {print $1}' "$file"

Aqui, definimos uma variável current_date do awk usando a opção -v .

Na tentativa 2, usar aspas simples dentro da string entre aspas simples acabou de sair da cotação. Você deve usar aspas duplas para cadeias de caracteres do awk e não deve citar $1 :

awk '$2 == "08-04" {print $1}' file.txt

Nas duas tentativas, não entendo por que você usa -F" ", . Por padrão, o awk se divide no espaço em branco, então você pode simplesmente omitir o separador de campo para a entrada de exemplo mostrada e o , é totalmente supérfluo. Além disso, frequentemente expressões awk como {if (A) B} podem ser reescritas como apenas A {B} , que é mais idiomático para o awk.

    
por 08.04.2018 / 07:37

Tags