вопросы манипулирования текстовым файлом - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть текстовый файл, который выглядит как ниже. Разделителями являются пробелы. Как вы можете видеть, разделители иногда удваиваются или утраиваются, поэтому одновременные разделители следует рассматривать как один разделитель. Кроме того, я хочу преобразовать дату в формат отметки времени MySQL.

   889468    216 -rw-r--r--   1 wls1     wls1       217868 Nov  1 00:42 /home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg
  2889469    228 -rw-r--r--   1 wls1     wls1       231092 Nov  1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
  2889471    196 -rw-r--r--   1 wls1     wls1       197452 Nov  1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
  2889470    196 -rw-r--r--   1 wls1     wls1       199512 Nov  1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
  2889472    236 -rw-r--r--   1 wls1     wls1       240152 Nov  1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
  2889473    232 -rw-r--r--   1 wls1     wls1       236876 Nov  1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
  2889474    224 -rw-r--r--   1 wls1     wls1       229292 Nov  1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
  2889475    228 -rw-r--r--   1 wls1     wls1       230476 Nov  1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
  2889477    224 -rw-r--r--   1 wls1     wls1       228708 Nov  1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
  2889476    216 -rw-r--r--   1 wls1     wls1       219104 Nov  1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg

Мне нужно извлечь полный путь к имени файла, отметке времени и имени пользователя владельца. Чтобы полученный файл выглядел так, как показано ниже. Разделитель должен быть одним символом табуляции. И поле даты должно быть преобразовано в метку времени MySQL.

/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg     wls1    2019-11-01 00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg    wls1    2019-11-01 01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg       wls1    2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg   wls1    2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg    wls1    2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg    wls1    2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg       wls1    2019-11-01 04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg       wls1    2019-11-01 04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg   wls1    2019-11-01 04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg      wls1    2019-11-01 04:31:00

Чтобы выполнить вышеизложенное, я пытался использовать cat и cut следующим образом:

cat text.txt | cut -d ' ' -f 12,25,27,28,29

Я изменяюаргумент для директивы -f, указывающий, какие столбцы вырезать, какие столбцы я хочу, но я вижу, что одновременные пробелы не будут рассматриваться как один разделитель.

Приведенный выше оператор cat / cut дает следующее:

1 217868  1 00:42
wls1 Nov 1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
wls1 Nov 1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
wls1 Nov 1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg

Итак, вышесказанное является шагом в правильном направлении.

Но обратите внимание на эту верхнюю линию? Размер файла в этой строке меньше на один символ, поэтому он испортил его. Кроме того, я не уверен, как изменить порядок столбцов и переформатировать отметку времени.

Заранее благодарен за помощь!

1 Ответ

0 голосов
/ 09 ноября 2019

Если вы хотите начать с предоставленного файла text.txt, попробуйте следующее:

declare -A m2n=([Jan]=1 [Feb]=2 [Mar]=3 [Apr]=4 [May]=5 [Jun]=6 [Jul]=7 [Aug]=8 [Sep]=9 [Oct]=10 [Nov]=11 [Dec]=12)

while IFS= read -r line; do
    fname="$(cut -c 73- <<< "$line")"
    read -r -a ary <<< "$line"
    date=$(printf "%04d-%02d-%02d" "$(date +%Y)" "${m2n[${ary[7]}]}" "${ary[8]}")
    time="${ary[9]}:00"
    printf "%s\t%s\t%s\t%s\n" "$fname" "${ary[4]}" "$date" "$time"
done < "text.txt"

Результат:

/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg wls1    2019-11-01      00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg        wls1    2019-11-01      01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg   wls1    2019-11-01      01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg       wls1    2019-11-01      01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg        wls1    2019-11-01      01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg        wls1    2019-11-01      01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg   wls1    2019-11-01      04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg   wls1    2019-11-01      04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg       wls1    2019-11-01      04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg  wls1    2019-11-01      04:31:00

Обратите внимание, что столбцы визуально не выровнены из-запеременной длины имен файлов.

Потенциальная проблема приведенного выше сценария - получение года. Информация о годе отсутствует в файле, и вам может понадобиться добавить условную ветвь, особенно когда вы пересекаете годы.

Если вы можете вернуться к исходным файлам и можете напрямую выполнить команду find надпопробуйте вместо этого:

find /home/wls1 -type f -name "*.jpg" -printf "%p\t%u\t%TY%Tm%Td\t%TH:%TM:%.2TS\n"

, который принесет вам желаемый результат.
Надеюсь, это поможет.

...