Замените запятые двоеточиями и переместите все значения в одну строку

Вставьте это в сегмент sed. Ваш результат - sendin newline в конце каждого символа.

Заменить sed (после |):

sed ': a; N; $! Ba; s / \ n / / g '' s / .AssociationID = ([*]) \ '

Это будет считывать весь файл в цикле, а затем заменяет строки новой строки пробелом.

Обновление: объяснение.

create a label via :a
append the current and next line to the pattern space via N
if we are before the last line, branch to the created label $!ba 
($! means not to do it on the last line (as there should be one final newline)).
finally the substitution replaces every newline with a space on the pattern space
(which is the whole file).

Возможно, вам потребуется настроить его для вашего окончательного вывода, но это должно вылечить проблему с одним символом на строку с помощью sed.

1
задан 1 January 2012 в 21:05

4 ответа

Не уверен, правильно ли я понимаю, но для показанных вами ввода и вывода следующая команда sed может выполнить преобразование, принимая во внимание, что ваш входной файл содержит терминаторы линии CR-LF:

sed 's/,/:/g;s/ /,/g' <<<$(tr -d '\r' <input_file) | tee output_file.tmp
mv output_file.tmp input_file
3
ответ дан 25 May 2018 в 15:32
  • 1
    $ sed 's/,/:/g;s/ /,/g' <<<$(<z1.csv) [новая строка] ,50:239 – Oxwivi 2 January 2012 в 00:45
  • 2
    Терминал выводит только последнюю строку CSV-файла, который был 50,239. Нет нового выходного файла, и исходный файл также не изменяется. – Oxwivi 2 January 2012 в 12:36
  • 3
    С входным файлом, который вы дали в вопросе, мои тесты показывают, что он работает отлично. Вероятно, ваш реальный входной файл имеет определенную особенность, не показанную в примере входного файла, и я не могу сказать, что, не видя его. Что касается модификации входного файла, вы не указали свой запрос в вопросе, его можно легко сделать с помощью некоторой дополнительной инструкции. – enzotib 2 January 2012 в 14:18
  • 4
    Не имеет значения, как результат виден мне, но даже если команда работала правильно, она не показывала полных результатов в терминале. Здесь используется весь файл. – Oxwivi 2 January 2012 в 15:48
  • 5
    @Oxwivi: см. Измененный ответ – enzotib 2 January 2012 в 15:56

Решение без внешних двоичных файлов - но более медленное (чтение строки за строкой и изменениями), '→': ')

while read -u 3 -r line; do 
        echo -n "${line/,/:}," >> new_file
done 3< old_file
1
ответ дан 25 May 2018 в 15:32

Неэффективен, но обязательно работает:

Откройте файл в gedit. Нажмите Ctrl + H. В find введите , и замените, введите :. Затем выберите «Заменить все».

Затем снова запустите экран «Найти и заменить». В поле «Найти» введите \n и оставьте поле «Заменить» пустым. Затем выберите «Заменить все».

Вот и все:)

1
ответ дан 25 May 2018 в 15:32
  • 1
    Спасибо, я не знал, как выражать новые строки (\n). И не совсем неэффективно, если есть функция «заменить все». :) – Oxwivi 2 January 2012 в 17:32

Это работает:

cat test| sed s/,/:/g | sed s/$/,/g | xargs

Но производит:

22:33, 45:533,

Поэтому вам, возможно, придется использовать эту более длинную версию, чтобы получить точный результат, который вы просили: [!d2 ]

cat test| sed s/,/:/g | sed s/$/,/g | xargs | sed "s/, /,/g"

Я уверен, что с sed / awk есть лучшие способы сделать это, хотя это и делает то, о чем вы просите, и довольно легко читать.

0
ответ дан 25 May 2018 в 15:32
  • 1
    $ cat z1.csv | sed s/,/:/g | sed s/$/,/g | xargs | sed "s/, /,/g" [новая строка] ,50:239 – Oxwivi 2 January 2012 в 00:47
  • 2
    Терминал выводит только последнюю строку CSV-файла, который был 50,239. Нет нового выходного файла, и исходный файл также не изменяется. – Oxwivi 2 January 2012 в 12:37
  • 3
    Таким образом, вы хотите, чтобы ваши изменения выполнялись на месте, которые вы не указали в вопросе (только «вход» и «вывод»). – totaam 2 January 2012 в 14:40
  • 4
    Ну, я не против, если исходный файл был изменен, но вывод на терминале отображал только последнюю строку, а не все. – Oxwivi 2 January 2012 в 15:44
  • 5
    Тогда с вашими исходными данными тоже что-то странное. Вероятно, требуется преобразование crlf. – totaam 2 January 2012 в 18:05

Другие вопросы по тегам:

Похожие вопросы: