Извлечь номер, если строки из файла в порядке имени файла даты

Для доступа к этим символам необходимо использовать клавишу выбора уровня 3. Обычно клавиша AltGr (aka right Alt) является клавишей выбора уровня 3. Для четвертого символа используйте Shift + AltGr.

2
задан 2 May 2018 в 15:58

3 ответа

Вы можете сделать это, объединив несколько общих инструментов:

find, чтобы перечислить все CSV-файлы (неупорядоченные) и выполнить команду для каждого basename, чтобы извлечь имя файла без .csv ] с пути date, чтобы интерпретировать спецификацию даты в имени файла и преобразовать ее в легко сортируемое число, например, в секундах с 1970 года. echo для печати рассчитанного числа и реального пути к файлу в одной строке для каждого файла sort для сортировки путей файла в соответствии с этим преобразованным номером даты cut для извлечения только путей файла из объединенного списка xargs cat для создания команды путем передачи всех имен файлов для команды cat для конкатенации их.

Полная строка выглядит так: если все файлы, которые мы хотим обработать, находятся в папке с именем datecsv:

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs cat
2018,1,1,aaa
2018,1,1,bbb
2018,1,2,ccc
2018,1,2,ddd
2018,4,30,eee
2018,4,30,fff

Мои файлы с примерами, :

$ cat datecsv/April-30-2018.csv
2018,4,30,eee
2018,4,30,fff
$ cat datecsv/January-01-2018.csv
2018,1,1,aaa
2018,1,1,bbb
$ cat datecsv/January-02-2018.csv
2018,1,2,ccc
2018,1,2,ddd

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

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs -n1 wc -l
2 datecsv/January-01-2018.csv
2 datecsv/January-02-2018.csv
2 datecsv/April-30-2018.csv

Единственное изменение - это последняя часть, где мы используем xargs -n1 wc -l вместо xargs cat, как указано выше.

Некоторые примечания: описанный выше подход относится к вашим именам файлов, которые являются форматом, который date может анализировать. Это относится к именам примеров, которые вы предоставили, но может измениться, если формат изменится. Он также требует, чтобы имя файла заканчивалось строчной буквой .csv. Не уверен, что некоторые специальные символы в именах файлов могут сломать материал (пробелы, вероятно, должны быть безопасными, новые строки, безусловно, сломают его).

3
ответ дан 22 May 2018 в 11:03
  • 1
    Благодарим вас за подробное объяснение. Я не знал и не помню basename и сложный трубопровод. – drN 2 May 2018 в 16:13

Вы можете сделать это, объединив несколько общих инструментов:

find, чтобы перечислить все CSV-файлы (неупорядоченные) и выполнить команду для каждого basename, чтобы извлечь имя файла без .csv ] с пути date, чтобы интерпретировать спецификацию даты в имени файла и преобразовать ее в легко сортируемое число, например, в секундах с 1970 года. echo для печати рассчитанного числа и реального пути к файлу в одной строке для каждого файла sort для сортировки путей файла в соответствии с этим преобразованным номером даты cut для извлечения только путей файла из объединенного списка xargs cat для создания команды путем передачи всех имен файлов для команды cat для конкатенации их.

Полная строка выглядит так: если все файлы, которые мы хотим обработать, находятся в папке с именем datecsv:

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs cat 2018,1,1,aaa 2018,1,1,bbb 2018,1,2,ccc 2018,1,2,ddd 2018,4,30,eee 2018,4,30,fff

Мои файлы с примерами, :

$ cat datecsv/April-30-2018.csv 2018,4,30,eee 2018,4,30,fff $ cat datecsv/January-01-2018.csv 2018,1,1,aaa 2018,1,1,bbb $ cat datecsv/January-02-2018.csv 2018,1,2,ccc 2018,1,2,ddd

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

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs -n1 wc -l 2 datecsv/January-01-2018.csv 2 datecsv/January-02-2018.csv 2 datecsv/April-30-2018.csv

Единственное изменение - это последняя часть, где мы используем xargs -n1 wc -l вместо xargs cat, как указано выше.

Некоторые примечания: описанный выше подход относится к вашим именам файлов, которые являются форматом, который date может анализировать. Это относится к именам примеров, которые вы предоставили, но может измениться, если формат изменится. Он также требует, чтобы имя файла заканчивалось строчной буквой .csv. Не уверен, что некоторые специальные символы в именах файлов могут сломать материал (пробелы, вероятно, должны быть безопасными, новые строки, безусловно, сломают его).

3
ответ дан 17 July 2018 в 15:28

Вы можете сделать это, объединив несколько общих инструментов:

find, чтобы перечислить все CSV-файлы (неупорядоченные) и выполнить команду для каждого basename, чтобы извлечь имя файла без .csv ] с пути date, чтобы интерпретировать спецификацию даты в имени файла и преобразовать ее в легко сортируемое число, например, в секундах с 1970 года. echo для печати рассчитанного числа и реального пути к файлу в одной строке для каждого файла sort для сортировки путей файла в соответствии с этим преобразованным номером даты cut для извлечения только путей файла из объединенного списка xargs cat для создания команды путем передачи всех имен файлов для команды cat для конкатенации их.

Полная строка выглядит так: если все файлы, которые мы хотим обработать, находятся в папке с именем datecsv:

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs cat 2018,1,1,aaa 2018,1,1,bbb 2018,1,2,ccc 2018,1,2,ddd 2018,4,30,eee 2018,4,30,fff

Мои файлы с примерами, :

$ cat datecsv/April-30-2018.csv 2018,4,30,eee 2018,4,30,fff $ cat datecsv/January-01-2018.csv 2018,1,1,aaa 2018,1,1,bbb $ cat datecsv/January-02-2018.csv 2018,1,2,ccc 2018,1,2,ddd

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

$ find datecsv/ -name '*.csv' -exec bash -c 'echo "$(date -d "$(basename -s.csv "{}")" +%s) {}"' \; | sort -n | cut -d' ' -f2- | xargs -n1 wc -l 2 datecsv/January-01-2018.csv 2 datecsv/January-02-2018.csv 2 datecsv/April-30-2018.csv

Единственное изменение - это последняя часть, где мы используем xargs -n1 wc -l вместо xargs cat, как указано выше.

Некоторые примечания: описанный выше подход относится к вашим именам файлов, которые являются форматом, который date может анализировать. Это относится к именам примеров, которые вы предоставили, но может измениться, если формат изменится. Он также требует, чтобы имя файла заканчивалось строчной буквой .csv. Не уверен, что некоторые специальные символы в именах файлов могут сломать материал (пробелы, вероятно, должны быть безопасными, новые строки, безусловно, сломают его).

3
ответ дан 23 July 2018 в 16:24

Другие вопросы по тегам:

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