Эта работа основана на следующих фактах:
(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
find thumbs/ -not -name "*-s.jpg" -exec mogrify -resize 50% -quality 85 -strip {} \;
Чтобы ответить на вопрос в теме:
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 {} \;