2015-01-16 3 views
0

Образец данных:Как удалить символ новой строки, если строка не заканчивается с "

"data","123" 
"data2","qwer" 
"false","234 
And i'm the culprit" 
"data5","234567" 

Выходной текст должен быть

"data","123" 
"data2","qwer" 
"false","234And i'm the culprit" 
"data5","234567" 

В сущности, я хочу, чтобы исправить мой файл CSV (который очень большой)

Я использую СЭД так ответ в СЭД поможет много :)

+1

Что делать, если вы замыкающие пробелы после закрытия '" '? – Jubobs

+0

Это не проблема, я думаю, CSV не обнаруживает те как проблема, и мы всегда можем обрезать –

+1

Вам нужно убедиться, что ваш файл не содержит конечных пробелов перед запуском команды Ed. – Jubobs

ответ

0

СЭД всегда неправильный выбор для любой проблемы который включает несколько строк. Просто используйте AWK:

$ awk '{printf "%s%s", (prev~/"$/?RS:""), $0; prev=$0} END{print ""}' file 
"data","123" 
"data2","qwer" 
"false","234And i'm the culprit" 
"data5","234567" 

выше просто проверяет, если предыдущая строка закончилась " и если это так, то он печатает по умолчанию разделитель (который является новой строки - можно заменить RS с ПРС или Hard- закодированный "\n", если вы предпочитаете), но если он этого не сделал, он ничего не печатает. Затем он печатает текущую запись без новой строки после нее. В конце всего он печатает новую строку.

+0

Не могли бы вы также объяснить это, но он работает хотя :) –

+1

Это не удастся на хорошо сформированных линиях, tespace. В качестве примера попробуйте добавить несколько пробелов после '' 123 ''в исходный файл, сохраните файл и снова запустите команду. – Jubobs

+0

Пояснение добавлено. @Jubobs OP специально рассматривал конечные пробелы в своем предыдущем комментарии и заявил, что это не проблема. –

0

Для полноты картины с СЭД это можно сделать так:

sed '/"\s*$/! { :loop; N; //! { $! b loop }; s/\n//g }' 

Это работает следующим образом:

/"\s*$/! { # if a line does not end with double quotes (possibly followed 
       # by whitespaces) 
    :loop  # jump label "loop" 
    N   # fetch the next line 
    //! {  # unless the content of the pattern space matches the 
       # previously attempted pattern (that is: unless it ends with a 
       # double quote, which is the case iff the last fetched line does) 
    $! b loop # and unless we reached the end of the input ($!), 
       # go back to "loop" 
    } 
    s/\n//g  # remove all newlines from the accumulated lines in the 
       # pattern space 
} 

Таким образом, это накапливает последовательные линии, которые не заканчиваются с двойную кавычку в пространстве рисунка и затем вставлять их вместе в одну строку перед печатью этой строки.

+0

не работает на 2-х очках для меня.1) странно (считывая код, который должен), 's/\ n // g'never происходят 2) последняя строка, завершенная символом' '', никогда не печатается – NeronLeVelu

+0

Оба этих случая обрабатываются, я могу только сказать «работает» для меня ». Используете ли вы GNU sed? – Wintermute

+0

Я не уверен, что BSD sed понимает' \ s'. Это может помочь заменить его на '[\ t]' для покрытия наиболее распространенных случаев. – Wintermute

0
sed ':cycle 
$ b 
/"$/ !N;s/\n//;t cycle' YourFile 

СЕПГ версия, но не является оптимальным для такого рода манипуляций

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