Почему моя команда awk выводит дополнительную строку? - PullRequest
2 голосов
/ 03 апреля 2012

Мне трудно отлаживать мои сценарии оболочки. У меня есть следующий файл test.csv

The Gardens,Gard (AUS),AEST,NSW,,Sandown Park,SPrk (AUS),AEST,VIC,,Grade 5,GR5,
Wentworth Park,WPrk (AUS) ,AEST,NSW,,The Meadows,Mead (AUS),AEST,VIC,,Juvenille,JUV,
Angle Park,AnPk (AUS),ACST,SA,,Warragul,Wgul (AUS),AEST,VIC,,,,

WPrk (AUS) имеет дополнительный пробел, который я хочу обрезать, а затем распечатать. Запуск

awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv

Производит

Gard (AUS):
Wentworth Park WPrk (AUS) AEST NSW  The Meadows Mead (AUS) AEST VIC  Juvenille JUV
WPrk (AUS):
AnPk (AUS):

Что я хочу, кроме второй строки, я не могу понять, почему это появляется

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv

Поскольку у вас есть gsub вне любого блока действия ({...}), каждая строка оценивается как условие . Он возвращает количество замен, которые он сделал, поэтому он вернет 0 на большинстве входов, но 1 на строках, которые вы хотите изменить. Поскольку нет никаких действий, сопровождающих его, выполняется действие по умолчанию, печатающее строку; вот почему вы печатаете полную строку.

Исправление, как уже говорили другие, помещает вызов gsub в блок действия.

(Кроме того, почему \,? Запятая не является специальным символом в оболочке.)

2 голосов
/ 03 апреля 2012

Вы писали:

awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv

Это сломано.

Формат сценария awk представляет собой набор конструкций, которые выглядят следующим образом:

   <i>condition</i> {
     <i>command;</i> 
     <i>...</i> 
    }

Идея заключается в том, что каждая строка во входных данных оценивается по условию . Если он совпадает, то выполняются команды в соответствующих фигурных скобках. Итак, что вы, вероятно, хотите, так это:

awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":";}' test.csv

Обратите внимание, что вам не нужно выходить из разделителя полей, если ваша оболочка не будет плохо с ним обращаться (т. Е. Если это была вертикальная черта, | вместо запятой). Исключая условие внутри скрипта, вы выполняете команды в фигурных скобках в КАЖДОЙ строке. Таким образом, это урежет 2 доллара, нужно ли его обрезать или нет, а затем выведите результат в соответствии с вашим примером в вашем вопросе.

2 голосов
/ 03 апреля 2012

Как насчет изменения команды на:

    awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}' test.csv

Это движется '{' вперед.

Отредактировано Как говорили другие, вам не нужно избегать запятых, достаточно -F,. Спасибо другим ответчикам:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...