Рекурсивно найдите файлы длиной 32 символа в каталоге и примените команду

Эта работа основана на следующих фактах:
(a) Все поля строго разделены табуляцией
(b) Общие столбцы в обоих файлах (B и C) имеют одинаковое значение

$ join --nocheck-order -eNaN -13 -22 -t$'\t' -o 1.1 1.2 1.3 1.4 1.5 2.3 2.4 b.txt c.txt
A   B   C   D   E   F   G
1   2   3   4   5   6   7
NaN 1   2   NaN 1   2   1

Образец файлов:

$ cat b.txt
A   B   C   D   E
1   2   3   4   5
    1   2       1
$ cat c.txt
B   C   F   G
2   3   6   7
1   2   2   1

Параметры объединения:
-13 -22 : Соединение на основе файла1 столбец3 (C) = файл2 столбец2 (C)
-t$'\t' : разделитель табуляции для ввода и вывода
-o : Формат вывода. 1.1 означает файл1, столбец1 и т. д.
-e : заполнить пустые значения NaN
Для получения дополнительной информации см. man join и еще лучше info join

Альтернативное решение с AWK
PS: Потерпите меня в awk, я новичок в awk.

$ awk -F"\t" '{a[1]="";{for (i=1;i<=NF;i++) if (i==6 ||i==7) continue;else \
if ($i!="") a[1]=a[1]FS$i;else a[1]=a[1]FS"NaN";print a[1]}}' <(paste b.txt c.txt)

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

awk 'BEGIN {FS=",";OFS="\t"}{a[1]="";{for (i=1;i<=NF;i++) if (i==6 ||i==7) continue;else \
if ($i!="") a[1]=a[1]OFS$i;else a[1]=a[1]OFS"NaN";print a[1]}}' <(paste b.txt c.txt)

Если вам нужно, чтобы вывод выводился также с запятой, просто замените раздел begine на {FS=OFS=","}

Хотя все еще неясно, что вы собираетесь делать с общими столбцами/различными значениями .

Вы можете удалить часть if (i==6 ||i==7) continue;else, чтобы увидеть, соответствуют ли результаты вашим потребностям. Эта проверка условия фактически пропускает поле 6 (столбец B файла 2) и поле 7 (столбец C файла 2), поскольку эти два столбца файла 2 до сих пор считались идентичными столбцам файла 1.

Для решения соединения:
Замените -t$'\t' на -t',' для чтения полей, разделенных запятыми

Для общих столбцов вы можете играть с этим форматом вывода:

join --nocheck-order -eNaN -13 -22 -t',' -o 1.1 1.2 2.1 1.3 2.2 1.4 1.5 2.3 2.4 b.txt c.txt
1
16.08.2016, 06:03
2 ответа
find thumbs/ -not -name "*-s.jpg" -exec mogrify -resize 50% -quality 85 -strip {} \;
0
28.01.2020, 01:12

Чтобы ответить на вопрос в теме:

find . -name '????????????????????????????????.jpg' -exec cmd {} \;

Чтобы вставить эти 32 ? s, с tcsh , zsh или bash в режиме emacs , введите Alt + 3 Alt + 2 ? . С этими оболочками и ksh в режиме vi введите ? , выйдите из режима вставки, нажав Esc , затем нажмите x , чтобы вырезать этот ? , а затем 32p , чтобы вставить его 32 раза.

С помощью GNU find вы также можете сделать:

find . -regextype egrep -regex '.*/[^/]{32}\.jpg' -exec cmd {} \;
0
28.01.2020, 01:12

Теги

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