![](/img/trans.png)
[英]How to trim leading and trailing whitespaces from a string value in a variable?
[英]Trim leading and trailing spaces from a string in awk
我正在嘗試刪除以下input.txt
第二列中的前導和尾隨空格:
Name, Order
Trim, working
cat,cat1
我已經使用下面的awk
刪除了第二列中的前導和尾隨空格,但它不起作用。 我錯過了什么?
awk -F, '{$2=$2};1' input.txt
這給出了輸出:
Name, Order
Trim, working
cat,cat1
不會刪除前導和尾隨空格。
如果您想修剪所有空格,僅在有逗號的行中,並使用awk
,那么以下內容對您有用:
awk -F, '/,/{gsub(/ /, "", $0); print} ' input.txt
如果您只想刪除第二列中的空格,請將表達式更改為
awk -F, '/,/{gsub(/ /, "", $2); print$1","$2} ' input.txt
請注意, gsub
將//
的字符替換為第二個表達式,在作為第三個參數的變量中 - 並且in-place
這樣做 - 換句話說,完成后, $0
(或$2
)已被修改。
完整解釋:
-F, use comma as field separator
(so the thing before the first comma is $1, etc)
/,/ operate only on lines with a comma
(this means empty lines are skipped)
gsub(a,b,c) match the regular expression a, replace it with b,
and do all this with the contents of c
print$1","$2 print the contents of field 1, a comma, then field 2
input.txt use input.txt as the source of lines to process
編輯我想指出@BMW 的解決方案更好,因為它實際上只使用兩個連續的gsub
命令修剪前導和尾隨空格。 在給予信任的同時,我將解釋它是如何工作的。
gsub(/^[ \t]+/,"",$2); - starting at the beginning (^) replace all (+ = zero or more, greedy)
consecutive tabs and spaces with an empty string
gsub(/[ \t]+$/,"",$2)} - do the same, but now for all space up to the end of string ($)
1 - ="true". Shorthand for "use default action", which is print $0
- that is, print the entire (modified) line
刪除第二列中的前導和尾隨空格
awk 'BEGIN{FS=OFS=","}{gsub(/^[ \t]+/,"",$2);gsub(/[ \t]+$/,"",$2)}1' input.txt
一個 gsub 的另一種方式:
awk 'BEGIN{FS=OFS=","} {gsub(/^[ \t]+|[ \t]+$/, "", $2)}1' infile
@Geoff 的警告:請參閱下面的注釋,此答案中只有一個建議有效(盡管在兩列中)。
我會使用sed
:
sed 's/, /,/' input.txt
這將消除領先后的空間,
。 輸出:
Name,Order
Trim,working
cat,cat1
更普遍的可能是下文中,將后去除可能的多個空格和/或制表符,
:
sed 's/,[ \t]\?/,/g' input.txt
由於全局修飾符/g
它也適用於兩列以上
@Floris 在討論中要求刪除每個列中的尾隨和結尾空格(甚至是第一個和最后一個)而不刪除列中間的空格的解決方案:
sed 's/[ \t]\?,[ \t]\?/,/g; s/^[ \t]\+//g; s/[ \t]\+$//g' input.txt
*@Geoff 編輯,我已將輸入文件名附加到此文件名,現在它只刪除所有前導和尾隨空格(盡管從兩列中)。 此答案中的其他建議不起作用。 但是請嘗試:“此處有多個空格和 2 個空格” *
IMO sed
是這項工作的最佳工具。 但是,這里有一個awk
解決方案,因為您已經要求了:
awk -F', ' '{printf "%s,%s\n", $1, $2}' input.txt
想到刪除所有空格的另一個簡單解決方案是tr -d
:
cat input.txt | tr -d ' '
我剛遇到這個。 正確答案是:
awk 'BEGIN{FS=OFS=","} {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)} 1'
只需使用正則表達式作為分隔符:
', *' - 用於前導空格
' *,' - 用於尾隨空格
對於前導和尾隨:
awk -F' *,? *' '{print $1","$2}' input.txt
最簡單的解決方案可能是使用tr
$ cat -A input
^I Name, ^IOrder $
Trim, working $
cat,cat1^I
$ tr -d '[:blank:]' < input | cat -A
Name,Order$
Trim,working$
cat,cat1
以下似乎有效:
awk -F',[[:blank:]]*' '{$2=$2}1' OFS="," input.txt
如果在第二列中只假設一組空格是安全的(這是原始示例):
awk '{print $1$2}' /tmp/input.txt
添加另一個字段,例如awk '{print $1$2$3}' /tmp/input.txt
將捕獲兩組空格(第二列中最多三個單詞),如果較少,則不會中斷。
如果您有不確定(大量)數量的空格分隔詞,我會使用前面的建議之一,否則此解決方案是使用 awk 最簡單的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.