Сортировка столбцов из двух файлов с awk

Ваша команда расширяется до этого:

export VIDEOS=mp4 VIDEOS=wmv VIDEOS=avi VIDEOS=flv VIDEOS=mkv VIDEOS=m4u VIDEOS=mpg VIDEOS=mpeg

Выполните это для наблюдения то, что происходит:

echo export VIDEOS={mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}

(это назвало расширение фигурной скобки),


Вторая проблема - это bash действительно заключает в фигурные скобки расширение перед расширением параметра, не после него, таким образом, что-либо, что похоже на Ваше решение, будет грязно.

Необходимо было бы сделать что-то вроде этого:

eval echo \*.$VIDEOS

который станет раздражающим для ввода каждый раз.

Как насчет чего-то вроде этого:

videos() {
    find . -mindepth 1 -maxdepth 1 -type f \
        \( -name "*.mp4" -o -name "*.wmv" -o -name "*.avi" -o \
           -name "*.flv" -o -name "*.mkv" -o -name "*.m4u" -o \
           -name "*.mpg" -o -name "*.mpeg" \)
}

Затем вместо выполнения:

ls *.$VIDEOS

просто сделайте это:

videos

или если необходимо передать его команде:

ls $(videos)

Эта работа части:

echo *.{mp4,wmv,avi,flv,mkv,m4u,mpg,mpeg}

мог быть ключ к разгадке .bash_profile не работа. Например, это могло бы означать, что Вы используете zsh.

Скажите нам, что это делает:

echo $0

таким образом, мы можем выяснить, какой файл необходимо вставить его.

2
25.02.2012, 06:51
3 ответа

Если порядок не имеет значения (т.е. просто исключает все электронные письма с md5 в исключить файле), и Вы не связаны узами брака с awk, используете join:

join -v 1 -j 1 <(sort emails) <(sort excludes)

-v 1 говорит этому печатать строки в первом файле (электронные письма), которые не имеют соответствующей строки во втором файле (исключает).
-j 1 говорит этому только смотреть на первый столбец каждого.


Если Вы хотите использовать awk, я полагаю, что это должно работать:

awk 'NF==1{exclude[$1]++} NF==2&&!exclude[$1]' excludes emails

Или если эти два файла соответствуют линию за линией, и Вы только хотите исключить, например, выровнять 2, если у обоих есть тот же хеш на той конкретной строке, используйте это:

awk 'NF==1{hash[FNR]=$1} NF==2&&hash[FNR]!=$1' excludes emails
3
27.01.2020, 21:55
  • 1
    я могу наконец видеть то, что последний пример пытается сделать, если Ваш FNL предназначен, чтобы быть FNR. Я предполагаю, "шел тяжело", означает "не для того, чтобы". Здесь, в Австралии, "для хождения тяжело" означает "подниматься неожиданно (человек)", таким образом выясняя как это и FNL были связаны было "интересно"... (+1) для хорошего ответа... –  Peter.O 25.02.2012, 07:45
  • 2
    @Peter. O Да, FNR; "высоко подброшенный" была входная ошибка на планшете, который я использовал. Я перефразировал его и протестировал теперь. –  Kevin 25.02.2012, 08:13

Это обладает преимуществом, что файлы могут войти в любой порядок:

sort file1 file2 | uniq -u --check-chars 32 | grep -E '.{33}'

sort file1 file2 комбинирует и сортирует файлы при подготовке к uniq.

uniq -u --check-chars 32 рассматривает только первые 32 символа, и с -u, печать только уникальные строки.

grep -E '.{33}' печать только строки, содержащие 33 или больше символа.

Править

Как Peter. O указывает, это не обрабатывает случай, где две или больше записи в списке файлов имеют тот же md5. В этом случае те файлы не будут распечатаны. Мне нравится join решение лучшее.

Однако эта логика зависит от всех отдельных файлов, имеющих уникальный md5, который является плохим предположением в зависимости от использования этого вывода. Вот пример резервного сценария с помощью md5sum логики. Хотя join логика правильно определяет и fileA и fileB (в отличие от моего решения), существует все еще проблема:

echo "hello world" > fileA
cp fileA fileB
./backup_script.sh
cp fileA fileC
./backup_script.sh

op indend fileC, который будет сохранен?

2
27.01.2020, 21:55
  • 1
    Это - интересный подход, но это не печатает несопоставленные строки, для которых существует больше чем один с тем же несопоставленным ключом –  Peter.O 25.02.2012, 09:56

Эта команда должна работать:

awk '
  NR==FNR {
    a[$1]=$0;
    next
  }
  { if ( a[$1] ) delete a[$1] } 
  END { 
    for ( md5 in a ) { 
      if ( a[md5] ) { print a[md5] } 
    } 
  }
' file1 file2
1
27.01.2020, 21:55
  • 1
    Это печатает только последнюю несопоставленную строку, когда существует больше чем одна строка с тем же несопоставленным ключом. –  Peter.O 25.02.2012, 09:52

Теги

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