Удалить строки из файла CSV, если второй столбец находится в списке слов

Во FreeBSD есть ряд команд , которые используют тот же API, что и GNU дата для ввода дат на естественном языке от пользователя . Я только что нашел одну, которую можно обмануть, преобразовав эту дату во время эпохи Unix:

/usr/sbin/fifolog_reader -B 'last sunday' /dev/null 2>&1 |
  sed 's/^From[[:blank:]]*\([0-9]*\).*/\1/p'

(обратите внимание, что, по крайней мере, на FreeBSD 9.1-RELEASE-p2, где я это примерял, она, кажется, работает надежно только в том случае, если вы находитесь в UTC-таймзоне, а распознаваемые ею спецификации дат не обязательно совпадают с распознаваемыми датами GNU).

Обратите внимание, что некоторые оболочки имеют такую возможность встроены.

ksh93:

if (( timestamp < $(printf '%(%s)T' 'last sunday') )); then

zsh:

autoload calendar_scandate
calendar_scandate 'last sun'
if (( timestamp < REPLY)); then...

Или вы можете использовать perl и Date::Manip, если установлено:

last_sun=$(perl -MDate::Manip -e 'print UnixDate("last sunday","%s")')
if [ "$timestamp" -lt "$last_sun" ]; then...

Или:

if perl -MDate::Manip -e 'exit 1 unless $ARGV[0] < UnixDate("last sunday","%s")
    ' "$timestamp"; then....

Если целью является проверка временных меток файлов, то обратите внимание, что FreeBSD находит поддержку :

find file -prune -newermt 'last sunday'

В этом самом случае, если вам нужно время начала этой недели (недели, начинающиеся в воскресенье), вы можете сделать:

week_start=$(($(date '+%s - 86400*%w - 3600*%H - 60*%M - %S')))

Это должно работать как в GNU, так и в FreeBSD (или в любой другой системе, где поддерживается %s).

В часовых поясах с летним временем, которые будут отключены на час вокруг переключателя с/на летнее время.

.

1
18.07.2015, 16:39
2 ответа

Два шага:

  1. создать сценарий удаления (AUX) с print, если только m! Gmail.com! Hotmail.com | ... ! (обычное выражение огромно, но проблем нет)
  2. примените его к All.txt

Код:

perl -n0E 's/\n/|/g; say "print unless m!\\b($_ç)\\b!\n" ' remove.txt > AUX
perl -n AUX    All.txt > outfile

Update1: для учета регистра добавьте i в операторе сопоставления:

perl -n0E 's/\n/|/g; say "print unless m!@($_=)\\b!i\n" ' remove.txt > AUX

Update2 , чтобы иметь дополнительные домены удаления: создайте новый файл со списком исключений (extra.txt) и:

cat remove.txt extra.txt | 
  perl -n0E 's/\n/|/g; say "print unless m!@($_=)\\b!i\n" ' > AUX
perl -n AUX   All.txt > outfile
1
27.01.2020, 23:37
{   sed -ne's/./^[^,]*,[^,]*&/p' | 
    grep -vf- ./All.txt 
}   <./remove.txt >./outfile

Я думаю, это то, о чем вы спрашиваете. Я не уверен, какое отношение это имеет к ruby ​​ или к строке данных, о которой вы говорите ...

Если вы хотите, чтобы совпадения не учитывали регистр, просто добавьте ] -i параметр gnore case для grep , например:

{   sed -ne's/./^[^,]*,[^,]*&/p' | 
    grep -ivf- ./All.txt 
}   <./remove.txt >./outfile
1
27.01.2020, 23:37

Теги

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