awk неожиданно меняет текст - PullRequest
1 голос
/ 18 марта 2011

Я использую следующий оператор awk в моем сценарии оболочки.

#!/bin/sh
# read file line by line
file="/pdump/country.000000.txt"
while read line
do
mycol=`echo $line | awk -F"," '{print $2}'`
mycol_new=`echo $mycol | tr "[:lower:]" [:upper:]`
echo $line | awk -v var="$mycol_new" -F"," '{print $1 "," var "," $3 "," $4 "," $5 "," $6 "," $7 "," $8}'
done < $file

Он работает как положено.

Единственная проблема заключается в том, что если исходный текст \ N (косая черта N) в любом другом столбце, например, за 4 или 7 долларов США, он меняется на N (без косой черты).Как сохранить исходные значения при замене только второго столбца.

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

Вам необходимо использовать опцию -r для read в цикле while:

while read -r line

, которая сохраняет обратную косую черту на входе.Эта опция почти всегда должна использоваться.Сделай это привычкой.

0 голосов
/ 18 марта 2011

Если я правильно прочитал ваш код, вы пытаетесь:

  1. Чтение ввода из файла с разделителями-запятыми (CSV)
  2. Изменить второе поле на заглавные
  3. Распечатать результат.

В этом случае используйте AWK напрямую. Сохраните следующее в toupper_second_field.awk:

BEGIN { FS = ","; OFS="," }
{ $2 = toupper($2); print }

Первая строка устанавливает разделители полей для ввода (FS) и вывода (OFS) в запятую. Вторая преобразует поле # 2 в верхний регистр, затем печатает. Чтобы вызвать его:

awk -f toupper_second_field.awk /pdump/country.000000.txt

Логика намного проще, и вам не нужно беспокоиться об обратном слэше.

0 голосов
/ 18 марта 2011

awk удаляет обратную косую черту, если это не одна из распознанных escape-последовательностей. Так что, если бы это было \ n, awk распознал бы его как символ новой строки, но \ N просто интерпретировалось как N. Подробнее здесь

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