次のinput.txt
の2列目の先頭と末尾のスペースを削除しようとしています。
Name, Order
Trim, working
cat,cat1
下のawk
を使用して、2列目の先頭と末尾のスペースを削除しましたが、機能しません。私は何が欠けていますか?
awk -F, '{$2=$2};1' input.txt
これにより、出力が次のようになります。
Name, Order
Trim, working
cat,cat1
先頭と末尾のスペースは削除されません。
コンマのある行のみですべてのスペースをトリミングし、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
先頭と末尾を削除空白 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
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 ' '
これに出会ったばかりです。正解は次のとおりです。
awk 'BEGIN{FS=OFS=","} {gsub(/^[[:space:]]+|[[:space:]]+$/,"",$2)} 1'
セパレータとして正規表現を使用するだけです:
'、*'-先行スペース用
'*、'-末尾のスペース用
先頭と末尾の両方について:
awk -F' *, *' '{print $1","$2}' input.txt
以下はうまくいくようです:
awk -F',[[:blank:]]*' '{$2=$2}1' OFS="," 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
2列目にスペースのセットを1つだけと想定しても安全な場合(これは元の例です):
awk '{print $1$2}' /tmp/input.txt
別のフィールドを追加する、例えばawk '{print $1$2$3}' /tmp/input.txt
は、2組のスペース(2列目に最大3語)をキャッチし、それより少ない数でも中断しません。
スペースで区切られた不定の(多数の)単語がある場合は、以前の提案のいずれかを使用します。それ以外の場合、このソリューションはawkを使用して見つけるのが最も簡単です。