Замена первого номера файла на его половину

У меня есть серия файлов с двумя номерами в первой строке (т.е. 170 1742), а затем несколькими другими строками. Если я хочу просто заменить в каждом файле первое число для его половины (т. Е. 85 1742), как бы это сделать в Unix?

  • Извлечение частей строки, разделенной пробелами
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Как добавить строку, которая не начинается с '<' до предыдущей строки
  • Извлечение данных из сложной файловой структуры
  • Присвоить результат sed переменной
  • Прочитайте столбец из файла и добавьте конкретный столбец другого файла
  • Передача команды sed для открытия команды
  • Добавить строку в список, используя AWK или SED?
  • 3 Solutions collect form web for “Замена первого номера файла на его половину”

    perl -pi -e 's|\d+|$&/2|e if $. == 1; close ARGV if eof' ./*.txt 

    Заменит первую последовательность десятичных цифр на первую строку каждого не скрытого txt файла в текущем каталоге с каноническим десятичным представлением половины соответствующего числа (например, для 006, 3.5 для 007).

    Если число очень велико (например, больше 1e20), perl может переключиться на технические обозначения (5e + 19).

    Очевидно, что такой подход применим только к десятичным целым числам. При применении к .1 оно дало бы .5 вместо 0.05 ; когда применяется к 1,5, он будет давать 0.5.5 вместо 0.75 ; когда применяется к 0x10 , он будет давать 0x10 (только 0 уменьшается вдвое) вместо 8 или 0x8 и так далее.

    Если вы хотите обрабатывать десятичные числа в любых обозначениях (1, 010 (то есть 10, а не восьмеричные 8), -1.123, 2.23e-4, inf, бесконечность, NaN …)), вам нужно будет адаптировать соответствие регулярное выражение, например:

     s{(\d*\.\d+|\d+\.?)(e[-+]?\d+)?|nan|inf(inity)?}{$&/2}ie 

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

     s{\S+}{$&/2}e 

    Что-то вроде этого?

     awk 'FNR==1{print $1/2,$2;next}1' ./*.txt #or /directory/* or just file.txt 

    Или даже

     awk 'FNR==1{$1=$1/2}1' file1 

    Выше awk напечатает соответствующие результаты на вашем экране или вы можете перенаправить измененный вывод в новый файл с помощью >newfile

    С GNU awk вы можете применять изменения непосредственно в исходном файле с помощью опции gnu awk inplace:

     awk -i inplace 'FNR==1{$1=$1/2}1' file1 

    Если ваш awk не поддерживает на месте, вы можете сделать это вручную, как

      awk 'FNR==1{$1=$1/2}1' file > newfile && mv newfile file 

    На самом деле это то, что делает awk (и даже sed) внутри редактирования под капотом.

     tempd=$(mktemp -d) for f in ./*.csv do < "$f" \ sed -e '1y/\t-/ _/; 1!s/.*/[&]/' | dc -e ' [q]sq [?z0=q pc z0=?]s? # macro "?" to print line ?r2/ n32anpc l?x # 1st line div/2 the last stack elem print it+spc+2nd ' \ > "$tempd/$f" mv "$tempd/$f" . done rm -r "$tempd" 
    Interesting Posts
    Linux и Unix - лучшая ОС в мире.