Удалить повторяющиеся строки из файла, но оставить 1 вхождение

ManIVIcrious заявил в GitHub , что

может быть связан с вашим личным списком mime-приложений. В терминале можно попытаться выполнить следующее: $ xdg-mime default nemo.desktop inode/directory

Необходимо установить nemo в качестве значения по умолчанию для открытия каталогов.

, что действительно решило проблему.

-121--195258-

Следующий сценарий проверяет даты всех файлов, указанных в командной строке:

Требуется версия GNU sed , date и stat

$ cat check-dates.sh 
#! /bin/bash

for f in "$@" ; do
  # get date portion of filename
  fdate=$(basename "$f" .txt | sed -re 's/^.*(2015)/\1/')

  # convert it to seconds since epoch + 1 day
  fsecs=$(echo $(date +%s -d "$fdate") + 86400 | bc )

  # get modified timestamp of file in secs since epoch
  ftimestamp=$(stat -c %Y "$f")

  [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

$ ./check-dates.sh file-name-20151002.txt 
file-name-20151002.txt has been modified after 20151002
$ ls -l file-name-20151002.txt 
-rw-rw-r-- 1 cas cas 0 Oct 26 19:21 file-name-20151002.txt

Вот непроверенная версия, которая должна работать на Mac (и на FreeBSD и т.д.), если я правильно прочитал интерактивные страницы:

#! /bin/bash

for f in "$@" ; do
  # get date portion of filename
  fdate=$(basename "$f" .txt | sed -e 's/^.*\(2015\)/\1/')

  # convert it to seconds since epoch + 1 day
  fsecs=$(echo $(date -j -f %Y%m%d "$fdate" +%s) + 86400 | bc )

  # get modified timestamp of file in secs since epoch
  ftimestamp=$(stat -f %m "$f")

  [ "$ftimestamp" -gt "$fsecs" ] && echo "$f has been modified after $fdate"
done

-121--37002-

Подключены ли хост A и хост B к сети?

Если да, создайте мост между соответствующей виртуальной машиной и хостом.

1
19.05.2018, 21:33
4 ответа

Esto deja la primera ocurrencia:

awk '! a[$0]++' inputfile

start cmd:> echo 'this is a string
cont. cmd:> test line
cont. cmd:> test line 2
cont. cmd:> this is a string' | awk '! a[$0]++'
    this is a string
    test line
    test line 2
0
27.01.2020, 23:18

Демонстрационный файл stuff.txtсодержит:

one
two
three
one
two
four
five

Удаление повторяющихся строк из файла, если вы не возражаете против сортировки строк

$ sort -u stuff.txt 
five
four
one
three
two

Объяснение :Флаг u, отправленный для сортировки, говорит о сортировке строк файла и принудительной уникальности.

Удаление повторяющихся строк из файла, сохранение исходного порядка, сохранение первой:

$ cat -n stuff.txt | sort -uk2 | sort -nk1 | cut -f2-
one
two
three
four
five

Объяснение :Флаг n, переданный в команду cat, добавляет номера строк слева от каждой строки плюс пробел, затем первая команда сортировки говорит, что сортировать по уникальности, и только после первого слова, вторая команда сортировки говорит, что используйте номера строк мы сохранили на шаге 1, чтобы прибегнуть к исходному порядку, наконец, обрезав первое слово.

Удалить повторяющиеся строки из файла, сохранить порядок, оставить последним.

tac stuff.txt > stuff2.txt; cat -n stuff2.txt | sort -uk2 | sort -nk1 | cut -f2- > stuff3.txt; tac stuff3.txt > stuff4.txt; cat stuff4.txt
three
one
two
four
five

Объяснение :То же, что и раньше, но переверните файл, чтобы получить желаемый результат.

5
27.01.2020, 23:18

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

tac file | awk '! seen[$0]++' | tac

tacпереворачивает строки в файле, а awkвыводит только первое вхождение повторяющейся строки.

3
27.01.2020, 23:18

Если вы используете vim, попробуйте следующий код:

g/./if(temp == getline('.')) | let temp = getline('.') | else | :norm dd | endif
0
27.01.2020, 23:18

Теги

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