1回試してください

1回試してください

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" ",。 <--
  • ifawkの作業区切り文字の外で演算子を使用しようとすると、エラーが{ ... }発生します。syntax error ...

試み #2質問:

  • フィールド区切り文字の後にカンマが正しく配置されていませんawk -F" ",。 <--
  • 一重引用符が壊れています。'...'08-04'...'

正しい方法(変数をawkコマンドにパラメータとして渡す):

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

答え2

試行1の場合、シェルで変数を拡張するには二重引用符を使用する必要がありますが、結果として次のように$1書き直すことをお勧めします。

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

current_dateここでは、optionsを使用してawk変数を設定します-v

試行2では、単一引用符で囲まれた文字列内に単一引用符を使用すると、引用符が終了します。 awk文字列には二重引用符を使用する必要があり、引用しないでください$1

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

これら2つの試みのうち、を使用する理由を理解できません-F" ",。デフォルトでは、awkはスペースに分割されているため、表示されている入力例のフィールド区切り文字を省略できます,。また、awk 式は awk にもっと慣用的な{if (A) B}just で書き直すことができることがよくあります。A {B}

関連情報