Как удалить повторяющиеся строки внутри текстового файла и получить количество удаленных строк?

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 '$ten lugar de)

0
17.06.2019, 22:11
2 ответа
$ 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).

0
28.01.2020, 03:35

Вот двухэтапный процесс:

  1. awk-скрипт для создания sed-скрипта для удаления ненужных строк

    awk 'seen[$0]++ {print NR "d"}' file1 > remove.sed 
    
  2. затем используйте скрипт sed для удаления строк в нужных файлах

    sed -i -f remove.sed file1 file2
    
0
28.01.2020, 03:35

Теги

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