我想abc/123/efg從abc/123/efg/456
我嘗試獲取第一個NF - 1欄位并將它們與/.
所以我這樣做:
echo abc/123/efg/456 | awk -F "/" 'BEGIN {OFS="/"} {for(i=1;i<=NF-1;i ) {var = var $i} END {print var}'
但是,它并沒有像我預期的那樣作業。
我究竟做錯了什么?
有沒有辦法更優雅地做到這一點?
uj5u.com熱心網友回復:
要修復您的代碼:
echo "abc/123/efg/456" | awk -F "/" 'BEGIN {OFS="/"} {
for(i=1;i<NF;i ) var = (var ? var OFS : "") $i
}
END {print var}'
作為替代方案,您可以例如從最后一次出現的開始洗掉/直到字串的結尾。
echo "abc/123/efg/456" | awk '{sub("/[^/]*$", "")}1'
輸出
abc/123/efg
uj5u.com熱心網友回復:
一種想法是遞減NF,例如:
$ echo 'abc/123/efg/456' | awk 'BEGIN {FS=OFS="/"} NF--'
abc/123/efg
這是否是“最佳”解決方案將取決于您的其他編碼要求,即:
- 如果您在其中做額外的作業,
awk那么這可以與其他awk腳本結合使用 - 如果 的唯一目的
awk是剝離最后一個欄位,那么這可能是矯枉過正,更好的(?)解決方案可能是在bash(例如,引數替換dirname等)中執行操作
uj5u.com熱心網友回復:
這是我的方法:洗掉最后一個欄位。是的,就是這么簡單。編碼:
echo "abc/123/efg/456" | awk -F/ -vOFS=/ '{NF--; print}'
筆記
- 該標志
-F/指定輸入欄位分隔符 - 該標志
-vOFS=/指定輸出欄位分隔符 - 該
NF--陳述句將欄位數減一 - 該
print陳述句在洗掉最后一個欄位后列印整個記錄(行)
uj5u.com熱心網友回復:
最簡單的方法(如果您擔心額外的空行)
echo 'abc/123/efg/456\n\n' |
nawk 'NF=(-_<NF) * 3' FS='[/]' OFS='/' mawk 'NF * (NF = 3)' FS='[/]' OFS='/'
abc/123/efg
如果您擔心將 NF 一直遞減到負區:
mawk2 'NF -= !!NF' FS='[/]' OFS='/'
或者只是FS OFS為你擦洗它,無風險:
gawk NF=NF FS='[/][^/]*$' OFS=
如果它們代表任何型別的嵌套檔案夾/目錄,則使用此技巧獲取 2D 樹視圖:
nawk 'NF-=!!NF' FS='[/]' OFS='\f\b/'
abc
/123
/efg
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517999.html
標籤:壳awk
