Как получить желаемый результат при помощи bash-скрипта? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь получить этот вывод, я не знаю, как его получить, я ищу в Интернете, но я не знал, какое будет точное ключевое слово для поиска, поэтому я разместил его здесь, мой вопрос у меня есть CSV-файл data.csv, содержимое которого показано ниже Я пытался до сих пор показано мое MWE

cat data.csv|sed 's/\n.*//g'

10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5, 
line 5 text
10,1,6,"<J>
 line 6 text"
10,1,7,"line 7 text"
10,1,8,"
 line 8 text"
10,1,9,"line 9 text"

Я хочу вывод, как показано ниже

10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5,"line 5 text"
10,1,6,"<J>line 6 text"
10,1,7,"line 7 text"
10,1,8,"line 8 text"
10,1,9,"line 9 text"

Ответы [ 3 ]

1 голос
/ 02 июня 2019

В дополнение к ответу Сайруса, чтобы гарантировать, что 'line 5 text' заключен в двойные кавычки , вы можете добавить дополнительные выражения для замены ', ' на ',"' и строк, которые не заканчиваются на '"' с '"', например

sed -e '/".*"$/!{N;s/\n *//}' -e 's/, /,"/' -e '/"$/!{s/$/"/}' file

Первое выражение точно такое же.Это обеспечит ваш запрошенный вывод:

$ sed -e '/".*"$/!{N;s/\n *//}' -e 's/, /,"/' -e '/"$/!{s/$/"/}' file
10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5,"line 5 text"
10,1,6,"<J>line 6 text"
10,1,7,"line 7 text"
10,1,8,"line 8 text"
10,1,9,"line 9 text"
1 голос
/ 02 июня 2019

С помощью GNU awk для множественных символов RS, RT и gensub () вы можете просто описать каждую запись как последовательность из 4 полей, разделенных запятыми, заканчивающихся символом новой строки, а затем удалить символы новой строки и пробелы вокруг них:

$ awk -v RS='([^,]*,){3}[^,]*\n' '{$0=gensub(/\s*\n\s*/,"","g",RT)} 1' file
10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5,line 5 text
10,1,6,"<J>line 6 text"
10,1,7,"line 7 text"
10,1,8,"line 8 text"
10,1,9,"line 9 text"

и для обеспечения кавычек вокруг последнего поля:

$ awk -v RS='([^,]*,){3}[^,]*\n' '{$0=gensub(/\s*\n\s*/,"","g",RT); $0=gensub(/,([^",]*)$/,",\"\\1\"",1)} 1' file
10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5,"line 5 text"
10,1,6,"<J>line 6 text"
10,1,7,"line 7 text"
10,1,8,"line 8 text"
10,1,9,"line 9 text"

Обратите внимание, что это будет работать независимо от того, на сколько строк разбито ваше 4-е поле:

$ cat file
10,1,1,"line 1 text"
10,1,2,
foo
line
2
text
bar
10,1,3,"line 3 text"

$ awk -v RS='([^,]*,){3}[^,]*\n' '{$0=gensub(/\s*\n\s*/,"","g",RT); $0=gensub(/,([^",]*)$/,",\"\\1\"",1)} 1' file
10,1,1,"line 1 text"
10,1,2,"fooline2textbar"
10,1,3,"line 3 text"
1 голос
/ 02 июня 2019

С GNU sed:

sed '/".*"$/!{N;s/\n *//}' file

Если строка не соответствует регулярному выражению ".*"$ добавьте следующую строку (N) к пробелу шаблона sed и замените символ новой строки, за которым не следует ни один, один или несколько пробелов ничем (s/\n *//).

Выход:

10,1,1,"line 1 text"
10,1,2,"line 2 text"
10,1,3,"line 3 text"
10,1,4,"line 4 text"
10,1,5, line 5 text
10,1,6,"line 6 text"
10,1,7,"line 7 text"
10,1,8,"line 8 text"
10,1,9,"line 9 text"

Я не добавил пропущенные кавычки в строку 5.


См .: man sed и Часто задаваемые вопросы о регулярных выражениях переполнения стека

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