Добавление пустой строки между первой и второй строкой в ​​текстовом файле - PullRequest
0 голосов
/ 28 ноября 2018

Файл (foo.csv) содержит записи (четыре столбца) следующим образом:

A 5.3 3.2 1.2 
A 2.1 3.4 6.7
A 3.4 2.1 5.6 
A 0.4 2.2 4.2

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

Я хочу, чтобы вывод был следующим.

4

A 5.3 3.2 1.2 
A 2.1 3.4 6.7
A 3.4 2.1 5.6 
A 0.4 2.2 4.2

Вот что я пытался.

#to get the total number of lines in the file foo.csv
t=$((wc -l foo.csv | cut -d" " -f1))
#to add an empty line 
sed -i "1i\\" foo.csv
#to insert the total number at the top; this works fine.
sed -i "1i $t" foo.csv

Мне нужно сделать это для нескольких файлов,Итак, скрипт будет полезен.Проблема, кажется, в sed -i "1i\\" foo.csv.Как это исправить?

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Это может работать для вас (GNU sed):

sed -e '1e wc -l <file' -e '1H;1g' file

или делать все в sed:

sed -e '1e sed "$=;d" file' -e '1H;1g' file

Для оценки команд Unix используется команда e.Обычно это делается с помощью флага e для команды s, но его можно использовать после адреса, как в этой ситуации.

Альтернативно, с использованием канала:

wc -l <file | sed '1G' - file

или:

sed '$=;d' file | sed '1G' - file

Использовать результат команды wc или sed в качестве первого входного файла.

В ретроспективе самое простое решение (хотя и не самое эффективное):

sed 'H;$!d;=;x' file

Который выкладывает файл в пространство удержания и вставляет количество строк и пустую строку перед печатью пространства удержания.

0 голосов
/ 28 ноября 2018

Вы можете сделать это довольно просто, используя sed с формой 0,addr2 (см. man sed в разделе "Адреса" ) с общей заменой, например,

$ sed '0,/^/s/^/4\n\n/' file
4

A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2

.sed выражение просто находит первое вхождение начала строки 0,/^/, а затем заменяет начало строки на 4\n\n, используя s/^/4\n\n/

Добавьте параметр -i для редактирования-на месте (или -i.bak, чтобы создать заднюю часть оригинала (например, file.bak) при редактировании на месте.

Если вас интересует настройка количества строк, вы можете просто получить строкис wc -l с использованием подстановки команд , например

$ sed "0,/^/s/^/$(wc -l <file2)\n\n/" file2
8

A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2
A 5.3 3.2 1.2
A 2.1 3.4 6.7
A 3.4 2.1 5.6
A 0.4 2.2 4.2

( примечание: использование двойных кавычек вместо одинарных кавычек для расширения командызамена) * +1028 *

0 голосов
/ 28 ноября 2018

делать подсчет строк также с awk.

$ awk 'NR==FNR{next} FNR==1{print NR-1 ORS}1' file{,}

или с tac...tac

$ tac file | awk '1; END{print ORS NR}' | tac
0 голосов
/ 28 ноября 2018

Если вы в порядке с awk, не могли бы вы попробовать следующее.

awk -v line=$(wc -l < Input_file) 'FNR==1{print line ORS} 1'  Input_file

Если вы хотите добавить вывод в сам файл Input_file, тогда добавьте > temp_file && mv temp_file Input_file к указанному выше коду.

Объяснение: Добавление пояснения к приведенному выше коду тоже сейчас.

awk -v line=$(wc -l < Input_file  ) '       ##Creating variable line whose value is bash command wc -l to get line count for Input_file as per OP request.
FNR==1{                                     ##Checking if line number is 1 here then do following.
  print line ORS                            ##Printing variable line here with ORS whose value is new line here.
}                                           ##Closing FNR block here.
1                                           ##awk works on method of pattern and action mentioning 1 making condition TRUE and no action will make print to happen.
'  Input_file                               ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...