Получить все файлы, содержащие значение даты меньше даты ввода

Вырезать решение на основе фиксированных столбцов - фиксированный размер - фиксированная позиция символа:

$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.

Решение Bash:

$ while IFS= read -r line;do line="${line:6:13}-${line:14:2}";echo $line;done<file.txt

Решение на основе полей, а не символов:

while IFS= read -r line;do 
  line=$(cut -d' ' -f5- <<<"$line") #with space delimiter get field 5 up to the end
  line=$(cut -d- -f1-4 <<<"$line") #with delimiter="-" get field 1 up to 4
  line=$(sed "s/${line: -2}/-${line: -2}/g" <<<"$line") #insert a dash before last two characters
  echo "$line"
done<file

​​Однострочное с заменой процесса:

$ sed 's/..$/-\0/g' <(cut -d- -f1-4 <(cut -d" " -f5- file.txt)) #use >newfile at the end to send the results to a new file

Во всех случаях результат такой, как ожидалось, учитывая ваш входной файл (и включая # 1 в начале каждой строки)

{{1 }}
1
17.02.2017, 09:04
3 ответа

Предполагая, что синтаксический анализ ls в этом случае не подвержен ошибкам:

ls | awk '{ i = substr($0, 73, 10); if(i < "2016-08-11") print }'

или эквивалент

ls | awk '{ i = substr($0, 73, 10) } i < "2016-08-11" '
  • i = substr ($ 0, 73, 10) сохраняет извлеченную дату в переменную i
  • i <"2016-08-11" , если это условие истинно, вывести строку ввода

Поскольку дата находится в формате ГГГГ-ММ-ДД , простая строка сравнение будет работать без необходимости преобразования

2
27.01.2020, 23:34

Объединение соответствует и substr в awk , давая мне желаемый результат:

ls | awk 'match($0,"\+0000_"){i = substr($0,RSTART+6,10)} i < "2016-08-11" '
0
27.01.2020, 23:34

вы можете попробовать эту команду

вы можете ввести дату в формате yyymmdd в команде awk

ls *.txt > all_files.txt
awk -F_ -vin_date="20160427" '{split($2,a,"-");date=a[1]a[2]a[3];if(date+0<in_date)print}' all_files.txt
0
27.01.2020, 23:34

Теги

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