Оцените количество строк в файле и вставьте это значение в качестве первой строки

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

          wc -l 000600.txt | awk '{ print $1 }'

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

Пример: a.txt b.txt c.txt

 >>print a
   15

 >> print b
   22

 >>print c
   56

Затем следует добавить 15, 22 и 56 соответственно к: a.txt b.txt и c.txt

Я ценю помощь.


person Community    schedule 03.10.2020    source источник
comment
Когда вы говорите «оценить», я думаю, вы действительно имеете в виду «расчет».   -  person Ed Morton    schedule 03.10.2020


Ответы (4)


Таким образом, вы можете добавить номер строки в качестве первой строки для всех *.txt файлов в текущем каталоге. Кроме того, использование этой групповой команды здесь будет быстрее, чем команды редактирования на месте, в случае больших файлов. Не изменяйте пробелы или точки с запятой в группе.

for f in *.txt; do
    { wc -l < "$f"; cat "$f"; } > "${f}.tmp" && mv "${f}.tmp" "$f"
done
person thanasisp    schedule 03.10.2020

Например, вы можете добавить шаблон (LINENUM) в первую строку файла, а затем использовать следующий скрипт.

 wc -l a.txt  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i 's/LINENUM/LINENUM:{}/' a.txt

или просто используйте из этого скрипта:

wc -l a.txt  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i '1s/^/LINENUM:{}\n/' a.txt
person Farhad Sarvari    schedule 03.10.2020
comment
Фархад, спасибо, второй вариант сработал фантастически. Теперь мне нужно использовать цикл for или аналогичный, чтобы применить это ко всем файлам, а не только к каждому файлу a.txt. - person ; 03.10.2020
comment
Просто вызовите скрипт в цикле for. Я добавляю еще один ответ. - person Farhad Sarvari; 03.10.2020
comment
BEGIN {FS =" ";} устанавливает FS на значение по умолчанию, которое у него уже есть, и поэтому не делает ничего полезного. Сценарий sed потерпит неудачу, если LINENUM уже существует где-то в другом месте файла, и в этом нет необходимости. - person Ed Morton; 03.10.2020

Для перебора всего файла вы можете использовать этот скрипт.

 for f in `ls *` ; do if [ -f $f ];  then wc -l $f  | awk 'BEGIN {FS =" ";} { print $1;}' | xargs -I {} sed -i '1s/^/LINENUM:{}\n/' $f ; fi;  done
person Farhad Sarvari    schedule 03.10.2020
comment
Не используйте переменные ls * и кавычки. Ознакомьтесь с BashPitfalls. - person Cyrus; 03.10.2020

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

sed -i '1h;1!H;$!d;=;x' file1 file2 file3 etc ...

Сохраните каждый файл в памяти и вставьте номер строки последней строки в качестве размера файла.

Альтернатива:

sed -i ':a;$!{N;ba};=' file?
person potong    schedule 03.10.2020