web-dev-qa-db-ja.com

awkの文字列から先頭と末尾のスペースを削除する

次のinput.txtの2列目の先頭と末尾のスペースを削除しようとしています。

Name, Order  
Trim, working
cat,cat1

下のawkを使用して、2列目の先頭と末尾のスペースを削除しましたが、機能しません。私は何が欠けていますか?

awk -F, '{$2=$2};1' input.txt

これにより、出力が次のようになります。

Name, Order  
Trim, working
cat,cat1

先頭と末尾のスペースは削除されません。

44
Marjer

コンマのある行のみですべてのスペースをトリミングし、awkを使用する場合は、次のように機能します。

awk -F, '/,/{gsub(/ /, "", $0); print} ' input.txt

2番目の列のスペースのみを削除する場合は、式を

awk -F, '/,/{gsub(/ /, "", $2); print$1","$2} ' input.txt

gsubは、//の文字を、3番目のパラメーターである変数内の2番目の式に置き換えます。つまり、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

EDIT連続する2つのgsubコマンドで実際に先頭と末尾のスペースのみをトリムするため、@ BMWのソリューションの方が優れていることを指摘したいと思います。クレジットを与えながら、その仕組みについて説明します。

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
63
Floris

先頭と末尾を削除空白 2列目

awk 'BEGIN{FS=OFS=","}{gsub(/^[ \t]+/,"",$2);gsub(/[ \t]+$/,"",$2)}1' input.txt

1つのgsubによる別の方法:

awk 'BEGIN{FS=OFS=","} {gsub(/^[ \t]+|[ \t]+$/, "", $2)}1' infile
29
BMW

sedを使用します:

sed 's/, /,/' input.txt

これにより、,の後の先頭のスペースが削除されます。出力:

Name,Order
Trim,working
cat,cat1

より一般的なものは次のようになります。,の後の複数のスペースやタブを削除する可能性があります。

sed 's/,[ \t]\?/,/g' input.txt

グローバル修飾子/gがあるため、3列以上でも機能します


@Florisは、列の中央の空白を削除せずに、各列の末尾と末尾の空白(最初と最後を含む)を削除する解決策を議論で求めました。

sed 's/[ \t]\?,[ \t]\?/,/g; s/^[ \t]\+//g; s/[ \t]\+$//g'

IMO sedは、このジョブに最適なツールです。ただし、次のようにawkを使用したソリューションがあります。

awk -F', ' '{printf "%s,%s\n", $1, $2}' input.txt

すべての空白を削除するためのもう1つの簡単な解決策は、tr -dです。

cat input.txt | tr -d ' '
17
hek2mgl

これに出会ったばかりです。正解は次のとおりです。

awk 'BEGIN{FS=OFS=","} {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)} 1'
14
Ed Morton

セパレータとして正規表現を使用するだけです:

'、*'-先行スペース用

'*、'-末尾のスペース用

先頭と末尾の両方について:

awk -F' *, *' '{print $1","$2}' input.txt
2
Ilya Kharlamov

以下はうまくいくようです:

awk -F',[[:blank:]]*' '{$2=$2}1' OFS="," input.txt
2
Håkon Hægland

最も簡単な解決策は、おそらくtrを使用することです

$ cat -A input
^I    Name, ^IOrder  $
  Trim, working  $
cat,cat1^I  

$ tr -d '[:blank:]' < input | cat -A
Name,Order$
Trim,working$
cat,cat1
1
Fredrik Pihl

2列目にスペースのセットを1つだけと想定しても安全な場合(これは元の例です):

awk '{print $1$2}' /tmp/input.txt

別のフィールドを追加する、例えばawk '{print $1$2$3}' /tmp/input.txtは、2組のスペース(2列目に最大3語)をキャッチし、それより少ない数でも中断しません。

スペースで区切られた不定の(多数の)単語がある場合は、以前の提案のいずれかを使用します。それ以外の場合、このソリューションはawkを使用して見つけるのが最も簡単です。

0
Andrew