我有這個 AWK 腳本。
awk -v line=" foo bar " 'END
{
gsub(/^ | $/,"", line);
gsub(/ {2,}/, " ", line);
print line
}' \
somefile.txt
輸入檔案(somefile.txt)與我的問題無關。END模式之后的部分用于修剪變數中的額外空格line并將其列印出來。像這樣:
foo bar
我想看看在 AWK 中是否有更好、更緊湊的方法來做到這一點。使用gsub洗掉幾個額外的空格非常麻煩。維護者很難閱讀,也很難理解它的作用(尤其是如果以前從未使用過 AWK 的話)。關于如何使其更短或更明確的任何想法?
謝謝!
**編輯**
AWK 變數line在輸入檔案的 awk 處理期間被過濾,我想修剪之后留下的額外空格。
uj5u.com熱心網友回復:
使用你開始做的另一個選項gsub()可以做為:
awk '{gsub(/[ ][ ] /," "); gsub(/^[ ]/,"")}1' <<< " foo bar "
第一次呼叫gsub()將所有多個空格合并到欄位之前/之間的單個空格。第二個gsub(/^[ ]/,"")只是修剪保留在字串前面的單個空格。
兩種方法都行之有效。根據您的實際資料和您的FS價值,可能會偏愛其中一個,但在不了解更多資訊的情況下,它們幾乎是一種洗牌。
示例使用/輸出
$ awk '{gsub(/[ ][ ] /," "); gsub(/^[ ]/,"")}1' <<< " foo bar "
foo bar
uj5u.com熱心網友回復:
我在@DavidC.Rankin 的評論路徑上:
$ awk -v line=" foo bar " '
BEGIN {
$0=line
for(i=1;i<=NF;i )
printf "%s%s",$i,(i==NF?ORS:OFS)
}'
輸出:
foo bar
uj5u.com熱心網友回復:
對于當前示例,另一個選項可能是重新計算輸入記錄的文本,首先將 line 的值設定為輸入記錄,然后使用$1=$1
awk -v line=" foo bar " 'END {$0=line; $1=$1; print}' somefile.txt
輸出(引號只是為了清楚起見,沒有前導或尾隨空格)
"foo bar"
uj5u.com熱心網友回復:
使用您顯示的示例,請嘗試以下awk程式。由于您有一個awk變數并且您沒有讀取任何 Input_file 那么我們不需要使用END塊我們實際上可以BEGIN在程式中使用塊本身awk來讀取變數。
在這個awk程式中,我正在創建awk名為的變數line,并且在BEGIN該程式的部分中,我在行中用 NULL 全域替換開始和結束空格然后在變數中用 OFS(本身是一個空格)全域替換所有出現的空格(1 個或多個)line,然后列印它的值。
awk -v line=" foo bar " '
BEGIN{
gsub(/^[[:space:]] |[[:space:]] $/,"",line)
gsub(/[[:space:]] /,OFS,line)
print line
}
'
或考慮到您的awk程式中發生了其他功能/任務/作業,并且您只想在END部分中修剪變數,然后嘗試以下
awk -v line=" foo bar " '
END{
gsub(/^[[:space:]] |[[:space:]] $/,"",line)
gsub(/[[:space:]] /,OFS,line)
print line
}
' Input_file
uj5u.com熱心網友回復:
使用該split函式收集陣列中的所有欄位并substr洗掉最后一個前導空格:
$ awk -vline=" foo bar " 'END {s = ""; l = split(line, a)
for(i = 1; i <= l; i ) s = s " " a[i]; print substr(s, 2) "X"}' /dev/null
foo barX
尾隨X在這里表明尾隨空格也被洗掉。如果您最終決定使用它,請抑制它。其他解決方案,patsplit而不是split:
$ awk -vline=" foo bar " 'END {s = ""; l = patsplit(line, a, /[^ ] /)
for(i = 1; i <= l; i ) s = s " " a[i]; print substr(s, 2) "X"}' /dev/null
foo barX
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425933.html
上一篇:洗掉等號后的多行字串
下一篇:如何為以下情況撰寫單行cd命令?
