尝试1

尝试1

我正在尝试 awk 一个文件,其中包含以 DD-MM 格式映射到 DOB 的名称列表。

匹配在尝试 1) 中不起作用,因此我尝试按照尝试 2) 在命令行上运行它,但这仍然不起作用。有什么建议么?

谢谢

file.txt
jason 08-04

尝试1

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

file="file.txt"

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

尝试2

awk -F" ", '{
if ($2=='08-04')
   print "$1"
}' file.txt

答案1

您的两个方面都有一些问题尝试:

尝试#1问题:

  • 该变量$current_date未插入单引号内
  • 字段分隔符后的逗号错位awk -F" ",<--
  • if尝试在 awk 的操作分隔符之外使用运算符{ ... }- 将抛出syntax error ...

尝试#2问题:

  • 字段分隔符后的逗号错位awk -F" ",<--
  • 单引号损坏'...'08-04'...'

正确的方法(将变量作为参数传递到 awk 命令中):

awk -v d="$curr_date" '$2==d{ print $1 }' "$file"

答案2

对于尝试 1,您需要对要由 shell 扩展的变量使用双引号,但这会导致诸如$1.我建议这样重写:

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

current_date在这里,我们使用选项设置 awk 变量-v

在尝试 2 中,在单引号字符串内使用单引号只是退出引号。您应该对 awk 字符串使用双引号,并且不应该引用$1

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

在这两次尝试中,我不明白你为什么使用-F" ",.默认情况下,awk 按空格分割,因此您可以省略所示示例输入的字段分隔符,这,完全是多余的。此外,通常 awk 表达式{if (A) B}可以重写为 just A {B},这对于 awk 来说更惯用。

相关内容