Подтвердить что ты не робот

Обрезать ведущие и конечные пробелы из строки в awk

Я пытаюсь удалить ведущее и конечное пространство во втором столбце ниже input.txt:

Name, Order  
Trim, working
cat,cat1

Я использовал ниже awk, чтобы удалить ведущее и конечное пространство во втором столбце, но оно не работает. Что мне не хватает?

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

Это дает результат как:

Name, Order  
Trim, working
cat,cat1

Ведущее и конечное пространства не удаляются.

4b9b3361

Ответ 1

Если вы хотите обрезать все пробелы только в строках с запятой и использовать 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

EDIT Я хочу отметить, что решение @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

Ответ 2

удалить ведущее и конечное белое пространство во втором столбце

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

другим способом одним gsub:

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

Ответ 3

Я бы использовал 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'

IMO sed является оптимальным инструментом для этой работы. Однако здесь приходит решение с awk, потому что вы просили об этом:

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

Еще одно простое решение для удаления всех пробелов - tr -d:

cat input.txt | tr -d ' '

Ответ 4

Я просто наткнулся на это. Правильный ответ:

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

Ответ 5

Кажется, что работает следующее:

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

Ответ 6

Самое простое решение, вероятно, использовать tr

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

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

Ответ 7

Если безопасно допускать только один набор пробелов в столбце два (который является исходным примером):

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

Добавление другого поля, например. awk '{print $1$2$3}' /tmp/input.txt будет ловить два набора пробелов (до трех слов в столбце два) и не будет разбиваться, если их будет меньше.

Если у вас есть неопределенное (большое) количество слов, разделенных пробелами, я бы воспользовался одним из предыдущих предложений, в противном случае это решение будет проще всего с помощью awk.