Как изменить тот же файл в Unix? - PullRequest
0 голосов
/ 11 июня 2018

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

cat file.csv | tr -d " \t\n\r" | tr '|' '\n' |sed "s/.$//" >  file.csv 

входные данные:

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

ожидаемый вывод:

330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Использовать временный файл.Например:

cat file.csv | tr -d " \t\n\r" | tr '|' '\n' |sed "s/.$//" > filetemp.csv && cp filetemp.csv file.csv
0 голосов
/ 11 июня 2018

Быстрый и грязный трюк с вашей текущей командой:

(cat file.csv | tr -d ' \t\n\r' | tr '|' '\n' |sed "s/.$//" >  file2.csv && mv file2.csv file.csv)

Пояснения:

Добавление && mv file2.csv file csv к вашей команде вызовет операцию перемещения, если и толькоесли первая команда завершилась успешно.

При этом ваша текущая команда должна быть упрощена !!!Пример: избегайте использования cat и pipe, когда вы можете перенаправить stdin

(tr -d ' \t\n\r' < file.csv | tr '|' '\n' |sed "s/.$//" >  file2.csv && mv file2.csv file.csv)

После редактирования позвольте мне представить вам встроенную команду, которая изменит файл напрямую, без создания какого-либо промежуточного файла, дляДля этой цели я использую sed

Ввод:

$ more file.csv 
330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

330000,     200000,       ,    ,    xbdcb,   rrrrrr,   N,     
     N,    2018-06-14,N,|,

Команда:

$ sed -n -i.bak 'h;n;H;n;x;s/[\n ]//g;s/,|,$//;p' file.csv

Отредактированный файл:

$ more file.csv
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N
330000,200000,,,xbdcb,rrrrrr,N,N,2018-06-14,N

Пояснения:

  • -n используется для отключения печати по умолчанию sed
  • -i.bak - это изменение файла в строке и получение файла резервной копии .bak, если вы уверены, что измените его на -i, sed непосредственно изменит файл без создания резервной копии
  • h;n; -> h поместите содержимое текущей строки в буфер удержания и перейдите к следующей строке n
  • H;n; -> H добавьте текущую строку в буфер удержания иперейти к следующей строке
  • x; заменить буфер шаблонов и буфер удержания, чтобы выполнить модификацию и распечатать ее
  • s/[\n ]//g удаление всех пробелов и EOL из буфера шаблонов
  • s/,|,$// удаление ,|, в конце строки
  • p печать буфера шаблонов

И последнее, но не менее важное: если у вас больше пустых строк, чем показано в вашем примере, используйте:

$ sed -n -i.bak '/^ *$/!{h;n;H;x;s/[\n ]//g;s/,|,$//;p}' file.csv  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...