Вырезать решение на основе фиксированных столбцов - фиксированный размер - фиксированная позиция символа:
$ 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
в начале каждой строки)
Предполагая, что синтаксический анализ 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"
, если это условие истинно, вывести строку ввода Поскольку дата находится в формате ГГГГ-ММ-ДД , простая строка сравнение будет работать без необходимости преобразования
Объединение соответствует
и substr
в awk
, давая мне желаемый результат:
ls | awk 'match($0,"\+0000_"){i = substr($0,RSTART+6,10)} i < "2016-08-11" '
вы можете попробовать эту команду
вы можете ввести дату в формате 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