Bash: добавление символа (ов) после переменной echo $ в цикл for - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь проанализировать CSV-файл и получить определенные значения из полей, который работает:

$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue}"; done
regio: TOG
regio: APP
regio: APP
regio: APP

Но мне нужно добавить еще один символ в конце вывода эха:

$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue};"; done
;egio: TOG
;egio: APP
;egio: APP
;egio: APP

Как видите, добавленная точка с запятой была добавлена ​​в начале строки и заменена первым символом (r) строки. Кстати, не имеет значения, точка с запятой или какой-либо другой символ.

Это происходит только в цикле (как для, так и во время проверки на чтение), прямое эхо работает без проблем:

$ regiovalue=TOG; echo "regio: ${regiovalue};"
regio: TOG;

Bash версия:

$ bash --version | grep bash
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
  1. Почему это происходит? Я проверил документацию, но не смог найти ничего конкретного о замене символов в цикле.
  2. Как получить вывод (значение переменной и дополнительные символы) в одном эхо?

1 Ответ

0 голосов
/ 30 апреля 2018

Проблема здесь в том, что ваши строки, вероятно, оканчиваются на \r ... Это заставляет курсор возвращаться к началу строки ( возврат каретки ).

$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0d 0a 68  6f 77 0d 0a 61 72 65 0d  |hello..how..are.|
00000010  0a 79 6f 75 0d 0a                                 |.you..|
00000016

Вы должны отфильтровать это, возможно используя tr:

$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | tr -d $'\r' \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0a 68 6f  77 0a 61 72 65 0a 79 6f  |hello.how.are.yo|
00000010  75 0a                                             |u.|
00000012

Или установка разделителя записей awk:

$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
>     | awk -vRS='\r\n' '{print $0}' \
>     | hexdump -Cv
00000000  68 65 6c 6c 6f 0a 68 6f  77 0a 61 72 65 0a 79 6f  |hello.how.are.yo|
00000010  75 0a                                             |u.|
00000012

Как указал Доуг, вы можете просто использовать awk, чтобы сделать все:

awk -vRS='\r\n' -F';' '{print "regio: " $4}' < test.csv
...