
ちょっと難しい状況に陥っています。次のような内容のファイルがあります:
3 2017-05-30 2017-09-29
2 2017-05-27 2017-08-26
1 2017-05-27 2017-08-26
ここで、ユーザーは列 1 の値となる labelNum を選択して日付を変更することを選択します。プロンプトで、ユーザーが 3 と入力すると、列 2 を印刷します。
だから私は書きました。
cat temp.txt | grep $labelNum | awk '{print $2}'
が3の場合labelNum
、出力は次のようになります。2017-05-30
しかし、ユーザーがlabelNum
2 と入力すると、次のようになります。
2017-05-30
2017-05-27
2017-05-27
なぜなら、.txtファイル内のあらゆる場所で「2」を探しているからです。しかし、2の列2が欲しいlabelNum
ので、2017-05-27
これを実行する方法はありますか? grep の代わりに awk を使用しようとしましたが、うまくいきませんでした。
ありがとう。
編集: 行は動的であり、テキストファイルにエントリが追加されると変更される可能性があります。そのため、sedを使用して行にスキップすることはできません。
答え1
シングルawk:
awk -v lbl=$labelNum '$1 == lbl{ print $2 }' temp.txt
-v lbl=$labelNum
labelNum
-変数値をawkスクリプトに渡す$1 == lbl
- 1列目の値が変数値と等しい場合 - 後続の式を実行します
答え2
解決策を維持することもできます:
cat temp.txt | grep ^$labelNum | awk '{print $2}'
行の先頭に一致するか、
awk '/^'$labelNum'/{print $2}' temp.txt
同様に動作しますが、awk 内でのエスケープは難しいです。