Случаи количества строки в нескольких файлах

Я выполняю сервер Minecraft от debian терминала, и это - вероятно, неправильный способ сделать это, но он работает. Во-первых, sudo apt-get install screen, затем сохраните следующий сценарий как /etc/init.d/minecraft:

#!/bin/bash
case "$1" in
  start)
    screen -S minecraft /home/mc/server/craftbukkit.sh
    echo "Server started on screen minecraft"
    ;;
  stop)
    screen -X -S minecraft kill
    echo "Server shutting down"
    ;;
  *)
    echo "Usage: /etc/init.d/minecraft {start|stop}"
    exit 1
    ;;
esac

exit 0

Теперь, выполните следующие команды как корень:

update-rc.d -f minecraft defaults

Это сделает сервер Minecraft выполненным в фоновом режиме когда начальные загрузки системы. Для просмотра консоли работать screen -x minecraft в терминале. Для выхода из консоли нажмите Ctrl+A и затем D.

0
20.11.2013, 03:44
3 ответа

Общее решение для произвольных чисел файлов:

 for file1 in log1.txt log2.txt logN.txt; do
   for file2 in logA.txt logB.txt logC.txt; do
     for file3 in logD.txt logE.txt logF.txt; do
     match1=$(tail -n 5147 $file1 | grep -c 'The line');
     match2=$(grep -c "the line" $file2);
     match3=$(grep -c "the line" $file3);
     echo "($match1 + $match2 + $match3) * 200" | bc;
   done;
 done;
done

Это будет считать случаи the line в последних 5 147 строках каждого из $file1s и сохраняют это как $match1. Это будет затем считать случаи the line в каждом из $file2s и сохраняют его как match2 и количество случаев в каждом file3 как $match3. Затем это вычислит ($match1 + $match2 + $match3) * 200.

Просто добавляя еще один файл к тому, что Вы делаете и ремонтируете свой синтаксис:

echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \ 
      $(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" | 
        awk '{print ($1+$2+$3)*200}' 

Здесь существует несколько приемов. grep -c количества соответствуют вместо того, чтобы печатать их, таким образом, никакая потребность в wc. awk может сделать математику, таким образом, никакая потребность в bc. Я использую echo вместо expr потому что я не делаю арифметики в оболочке больше, просто повторив результаты трех поисков и передавая их awk. Это должно привести к чему-то как:

echo "10 4 12" | awk '{print ($1+$2+$3)*200}' 

Более краткая версия:

echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \ 
         $(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))

Это делает всю математику в оболочке, с помощью $(( )) нотация. Можно попробовать его echo $((2*4)). Не очень легко читать, это расширяется до:

echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"
1
28.01.2020, 02:28
  • 1
    я отредактировал свой вопрос разъяснить только первый файл, должен быть ограничен последними x строками. Ваше редактирование похоже на то, что я достигал... Я чувствовал, что моя исходная команда была путем, более сложным, чем это должно было быть. –  FGreg 20.11.2013, 03:49
  • 2
    @FGreg видит обновленный ответ, я сохранил общий случай для стольких файлов, сколько Вы желаете и дали более сжатую версию своей команды + еще один файл. –  terdon♦ 20.11.2013, 03:58
  • 3
    . Ваше третье предложение работает и имеет намного больше смысла, чем мое. Ваша вторая команда кажется прочь, хотя..., что NR>5146? Это проводит только последние 5 146 строк файла? –  FGreg 20.11.2013, 04:19
  • 4
    @FGreg да, NR специальное предложение awk переменная, которая содержит текущий номер строки. И поскольку я пишу этот комментарий, я понимаю, что это нисколько не, что Вы попросили, извините. Взгляните на обновленный ответ, все версии должны сделать то, что Вы хотите теперь, и я также добавил намного более короткий. –  terdon♦ 20.11.2013, 05:02

Я думаю, что необходимо смочь просто добавить третий файл после второй кошки:

expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc

пример:

$ echo abc > 1.txt 
$ echo cde > 2.txt 
$ echo def > 3.txt 
$ cat 1.txt 2.txt 3.txt | grep d 
cde 
def
2
28.01.2020, 02:28
  • 1
    Спасибо за вход. Ваше предложение точно, но я искал более чистую версию своей команды также. –  FGreg 20.11.2013, 04:20

Я решил аналогичную проблему с подсчетом строк в нескольких CSV-файлах.

У меня есть большой список CSV-файлов -вывод скрипта, так что поля у них одинаковые. Меня интересовало количество строк с допустимым значением.

Команда, которая сделала свое дело,

awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
  • -F,устанавливает разделитель на,(мои файлы CSV разделены ,)
  • '{if ($5>0.0) print $5}'— это «сценарий», который сообщает awkчто делать :
    • если 5-е поле больше, чем 0.0, то вывести 5-е поле
    • затем передайте это в wc, который с флагом -lбудет подсчитывать строки в выводе
  • va.2021-04-11.153123.csv va.2021-04-11.111709.csv— разделенный пробелом -список из двух CSV-файлов
0
11.04.2021, 20:39

Теги

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