我正在尝试 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 来说更惯用。