Создайте один файл на дату только с именами файлов, которые соответствуют этой дате - PullRequest
0 голосов
/ 28 января 2019

Для одного файла со списком имен файлов (с путями к файлам), например, например:

input.txt (contents):
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/02/abc.txt
/2018/06/02/xyz.txt
/2018/06/03/xyz.txt
/2018/06/03/abc.txt
/2018/06/01/ghi.txt

… необходимо создать один файл на дату только с именами файлов, которые соответствуют этомудата (все с использованием стандартных команд Unix) Например, ожидаемый результат:

cat 2018-06-01.txt =>
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/01/ghi.txt

cat 2018-06-02.txt =>
/2018/06/02/abc.txt
/2018/06/02/xyz.txt

Аналогично для всех других дат.

Ответы [ 4 ]

0 голосов
/ 28 января 2019

С GNU awk для управления gensub () и внутренними открытыми файлами:

awk '{print > gensub("/([^/]+)/([^/]+)/([^/]+)/[^.]+","\\1-\\2-\\3",1)}' file
0 голосов
/ 28 января 2019

Использование простого сценария bash.

#!/bin/bash
set -e
for i in `cat input.txt`
do
  y=`echo $i|cut -d "/" -f2`
  m=`echo $i|cut -d "/" -f3`
  d=`echo $i|cut -d "/" -f4`
  f_name=`echo "${y}-${m}-${d}.txt"`
  echo $i >>$f_name

done

Редактирование Эд Мортоном (см. Комментарии ниже)

Просто исправление вышеприведенных анти-паттернов и ошибок, но не на самом делеулучшая его сверх того и все еще не предполагая, что это будет разумным подходом:

#!/bin/env bash
set -e
while read -r i; do
  y=$(echo "$i"|cut -d '/' -f2)
  m=$(echo "$i"|cut -d '/' -f3)
  d=$(echo "$i"|cut -d '/' -f4)
  f_name="${y}-${m}-${d}.txt"
  echo "$i" >>"$f_name"

done < input.txt
0 голосов
/ 28 января 2019

Не могли бы вы также попробовать следовать, немного отличающийся от Джеймса сэра, я закрываю выходной файл, только когда его значение изменяется в Input_file (2-е, 3-е и 4-е поля) и не совпадает с предыдущим именем выходного файла (скореезатем закрываем его в каждой строке).Также используется / в качестве разделителя полей для линий.

awk '
BEGIN{
  FS="/"
  OFS="-"
}
{
  file=$2 OFS $3 OFS $4".txt"
}
prev!=file{
  close(prev)
  prev=file
}
{
  print >> (file)
}'  Input_file
0 голосов
/ 28 января 2019

Использование awk:

$ awk '
{
    split($0,a,/[/.]/)                 # split record on chars ./
    f=a[2] "-" a[3] "-" a[4] ".txt"    # make filename 
    print >> f                         # print (appending) to file
    close(f)                           # close the file to preserve fds
}' input.txt

Создано файлов:

$ ls
2018-06-01.txt
2018-06-02.txt
2018-06-03.txt

Содержимое файла:

$ cat 2018-06-01.txt
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/01/ghi.txt

Обратите внимание, что проверка ошибок отсутствует.

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