如果之前有人問過這個,我很抱歉。我已經看了,但找不到滿意的答案。
我有這個示例檔案 test.csv:
"abc","def,apple","2019-10-10"
我想根據最后一個中的日期輸出第一個欄位中的任何一個。我試過這個
gawk -vFPAT='[^,]*|"[^"]*"' '($3 >= "2018-10-10") {print $1}' test.csv
但輸出為空。
如果我洗掉 test.csv 中日期周圍的引號,則上述方法有效。該命令輸出“abc”。我有一個遵循上述模式的長檔案,我確信我可以使用一個簡單的正則運算式來洗掉日期周圍的引號,但是有沒有辦法通過更改上面的 gawk 命令來避免這種情況?
uj5u.com熱心網友回復:
$3is "2019-10-10",即包含引號,因此您需要在要比較的字串中包含引號:
gawk -v FPAT='[^,]*|"[^"]*"' '($3 >= "\"2018-10-10\"") {print $1}' test.csv
"abc"
這與僅通過設定 FS 起作用的解決方案之間的區別在于,如果/當您需要對最后一個欄位以外的欄位進行操作時,即使您的某些欄位包含逗號 ( ,) 或轉義引號 ( ""),它也會繼續作業。如果您的輸入是:
$ cat test.csv
"abc","very,""bad"",field","2019-10-10","other,""bad"",field."
$ gawk -v FPAT='[^,]*|"[^"]*"' '($3 >= "\"2018-10-10\"") {print $1}' test.csv
"abc"
你可能真的想將目標日期作為變數傳遞,所以我真的是這樣寫的:
$ gawk -v FPAT='[^,]*|"[^"]*"' -v tgt='"2018-10-10"' '$3 >= tgt {print $1}' test.csv
"abc"
uj5u.com熱心網友回復:
使用 awk:
awk -F ',' '$NF >= "\"2018-10-10\""{ print $1 }' test.csv
或者
awk -F '"' '$(NF-1) >= "2018-10-10"{ print $2 }' test.csv
$NF 包含最后一列
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386368.html
