簡體   English   中英

從 awk 中的字符串修剪前導和尾隨空格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM