
我陷入了一個棘手的境地。我有一個文件,其內容如下所示:
3 2017-05-30 2017-09-29
2 2017-05-27 2017-08-26
1 2017-05-27 2017-08-26
現在,使用者選擇透過選擇 labelNum 來修改日期,該 labelNum 將是第 1 列中的值。
所以我寫了。
cat temp.txt | grep $labelNum | awk '{print $2}'
如果labelNum
是 3,我得到的輸出為2017-05-30
但是,如果使用者輸入labelNum
2,那麼我得到:
2017-05-30
2017-05-27
2017-05-27
因為它在 .txt 檔案中到處尋找“2”。但是,我想要第 2 列為labelNum
2,即2017-05-27
有沒有辦法做到這一點?我嘗試使用 awk 代替 grep 但沒有成功。
謝謝。
編輯:行是動態的,並且可以隨著更多條目添加到文字檔案中而改變。所以不能真正使用 sed 跳到該行
答案1
與單awk:
awk -v lbl=$labelNum '$1 == lbl{ print $2 }' temp.txt
-v lbl=$labelNum
- 將變數值傳遞labelNum
到 awk 腳本中$1 == lbl
- 如果第一列值等於變數值 - 執行後面的表達式
答案2
您也可以保留您的解決方案:
cat temp.txt | grep ^$labelNum | awk '{print $2}'
它將在行的開頭匹配,或者
awk '/^'$labelNum'/{print $2}' temp.txt
工作方式類似,但是 awk 內部的轉義很棘手。