Si por ksh
, te refieres a ksh93:
$ t=093500
$ DATEMSK=/dev/stdin <<<%H%M%S printf "%(%F %T)T\n" "$t"
2018-05-17 09:35:00
O:
$ printf '%(%F)T %.8s\n' now "${t//??/\0:}"
2018-05-17 09:35:00
O portablemente (conchas de familias Bourne o csh ofish
)
$ date +"%Y-%m-%d $t" | sed 's/\(..\)\(..\)$/:\1:\2/'
2018-05-17 09:35:00
(para rc -como conchas, use date +'%Y-%m-%d '$t
en lugar de)
$ awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; next } (FNR in keep) { printf("%s -> %s\n", keep[FNR], $0) }' file1 file2
line A -> line 1
line B -> line 2
line C -> line 4
Это воспроизводит вывод в середине вопроса с помощью программы awk
.
Программа читает первый файл(file1
)и находит повторяющиеся строки в первом блоке. Этот блок также сохраняет строки в массиве keep
, индексированном по номеру строки.
При чтении второго файла (второго блока в коде ), если номер строки тот, который мы хотели бы сохранить, вывести сохраненную строку из первого файла вместе со строкой из второго файл.
Вариант сохранения двух новых файлов:
awk 'FNR==NR && !seen[$0]++ { keep[FNR]=$0; print >FILENAME ".new"; next } (FNR in keep) { print >FILENAME ".new" }' file1 file2
Это запишет file1.new
только с уникальными строками в file1
и запишет file2.new
с теми же строками, но из file2
.
Единственным недостатком этого решения является то, что оно требует 2 x
памяти, где x
— количество уникальных строк в первом файле, т. е. оно будет хранить две копии каждой уникальной строки вfile1
(как индекс в seen
и как значения в массиве keep
).
Вот двухэтапный процесс:
awk-скрипт для создания sed-скрипта для удаления ненужных строк
awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed
затем используйте скрипт sed для удаления строк в нужных файлах
sed -i -f remove.sed file1 file2