2013-07-11 1 views
1

Может ли кто-нибудь объяснить мне этот небольшой скрипт.awk и запятая точка с запятой (;) в назначенном поле

echo -e "\"aa;bb\";cc ;\"dd ;ee\"; 
ff" | awk -v RS=\" -v ORS=\" 'NR%2==0{gsub(";",",")} 
{print}' 

В этом сценарии полей, разделенных (;), но если есть один или несколько (;) в любом поле, то это поле окружено "" .Это-х CSV-file.

Поэтому для дальнейшего разбора необходимо заменить все (;) на это fields.

ответ

2

эхо печатает две строки:

"aa;bb";cc ;"dd ;ee"; 
ff 

И расколы записи с каждой двойной кавычки, а в четных заменить все точки с запятой запятыми (gsub).

Итак, первая запись будет содержанием перед первой двойной цитатой, это пустая запись, но важной частью является условие NR%2==0. NR - это одно условие, поэтому условие будет ложным, gsub() не будет исполнено, оно будет напечатано с его ORS, поэтому выход будет двойной.

Для второго содержания записи будет aa;bb, NR%2==0 будет истинным и заменит точку с запятой.

Для третьего содержания записи будет ;cc ;, NR%2==0 будет ложным и будет напечатано.

И так далее до конца файла.

+0

Извините, но я не могу понять, почему * «Для второго содержимого записи будет aa; bb, NR% 2 == 0 будет true и заменит точку с запятой.» * И * «Для третьего содержимого записи будет: cc ; NR% 2 == 0 будет ложным, и оно будет напечатано. "* Означает" TRUE "и" FALSE "соответственно. – Andry

+0

@Andry: Каждая двойная кавычка разделяет каждую запись, а переменная 'NR' означает количество прочитанных записей. Итак, '2% 2 == 0' истинно, а' 3% 2 == 0' - false. – Birei

+0

Спасибо, друг. Теперь я все понимаю. – Andry

 Смежные вопросы

  • Нет связанных вопросов^_^