Команда bash для поиска указанного c бита информации в строке текстового файла? - PullRequest
0 голосов
/ 24 января 2020

Я запускаю команду, которая выводит это в /tmp/foo.txt:

Title: 01, Length: 01:39:03.734 Chapters: 15, Cells: 17, Audio streams: 04, Subpictures: 04
Title: 02, Length: 00:00:01.000 Chapters: 02, Cells: 02, Audio streams: 00, Subpictures: 00
Title: 03, Length: 00:00:01.500 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 04, Length: 00:00:01.500 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 05, Length: 00:00:01.500 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 06, Length: 00:01:22.100 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 07, Length: 00:02:51.233 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 08, Length: 00:13:56.834 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 09, Length: 00:05:24.700 Chapters: 05, Cells: 06, Audio streams: 01, Subpictures: 00
Title: 10, Length: 00:24:02.100 Chapters: 02, Cells: 03, Audio streams: 01, Subpictures: 00
Title: 11, Length: 00:00:00.500 Chapters: 01, Cells: 01, Audio streams: 04, Subpictures: 04
Title: 12, Length: 00:00:00.500 Chapters: 01, Cells: 01, Audio streams: 04, Subpictures: 04

Как найти строку с самым длинным заголовком (в данном случае это заголовок 01, но он выиграл не всегда первая строка / заголовок) ТОГДА получите номер заголовка, удаляя начальный ноль, если он есть?

Ответы [ 2 ]

1 голос
/ 24 января 2020

Это немного грязно в bash, и ему нужен awk. Возможно, вам лучше использовать Python или что-то еще, но в любом случае вот как вы можете это сделать:

#!/bin/bash
unset longest_milliseconds
while read -r line; do
  milliseconds=$(awk '{ print $4 }' <<<"$line" | awk -F: '{ print $1 * 3600000 + $2 * 60000 + $3 * 1000 }')
  if [[ -z ${longest_milliseconds+x} || $milliseconds -gt $longest_milliseconds ]]; then
    longest_milliseconds=$milliseconds
    longest_title=$(awk -F,?\  '{ print $2 * 1 }' <<<"$line")
  fi
done < /tmp/foo.txt
echo "$longest_title"
0 голосов
/ 24 января 2020

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

#!/bin/bash
shopt -s extglob                                                                                                                                                                             

max=0
all=()

while IFS= read -r line; do
  all+=("$line")
  lines=${line#*,}
  lines=${lines#*:}
  lines=${lines#*[[:space:]]}
  lines=${lines%%[[:space:]]*}
  [[ $lines > $max ]] && max=$lines
done < /tmp/foo.txt

while read -ra line1; do
  for i in "${!line1[@]}"; do
    if [[ ${line1[$i]} == *$max* ]]; then
      longest=${line1[$i-2]%,*}
      printf '%s' "${longest##+(0)}"
    fi
  done
done < <(printf '%s\n' "${all[@]}") 

Кстати, я использую bash4 +, поэтому я не не знаю, будет ли это работать на bash3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...