Из руководства Bash> Расширение истории:
Обозначение события
! Начать подстановку в истории, кроме случаев, когда за ними следует
пробел, новая строка, возврат каретки, = или ((когда параметр оболочки
extglob включен с помощью встроенной функции shopt).
! n Обратитесь к командной строке n.
Обозначения слов
$ Последнее слово. Обычно это последний аргумент, но
расширяется до нулевого слова, если есть только одно слово в строке.
Итак, ! $
просто повторяет последнее слово из предыдущей команды
Пример:
$ echo Unix and Linux
Unix and Linux
$ echo !$
echo Linux
Linux
$ cat dir1
cat: dir1: Is a directory
$ cd !$
cd dir1
После выполнения команды с ! $
, нажмите ↑ , и вы получите результат ! $
.
$ awk 'NR == FNR { names[$1]; next }
{ for (name in names) printf("%s%s\n", name, $0) }' file1 file2
Adam,2018-2-1301
Tim,2018-2-1301
John,2018-2-1301
Adam,2018-3-1379
Tim,2018-3-1379
John,2018-3-1379
Adam,2018-1-3809
Tim,2018-1-3809
John,2018-1-3809
Adam,2018-2-5801
Tim,2018-2-5801
John,2018-2-5801
Это использует awk
для чтения первого файла (файла с тремя именами )в ассоциативный массив (в качестве ключей ). Когда дело доходит до чтения второго файла, каждая строка второго файла выводится повторно вместе с каждым ранее прочитанным именем.
Тест NR == FNR
верен, если мы читаем из первого файла. Он проверяет общий номер записи ("номер строки" )с номером записи в текущем файле.
Вы также можете выполнить перекрестное соединение с GNU join
следующим образом:
$ join -j 99 -o1.1,2.1 file[12]
Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801
... где 99
— несуществующее -поле в любом файле.
В этом примере вставленные пробелы можно удалить, передав результат через tr -d ' '
.
Как насчет этого?
$ cat names
Adam
John
Tim
$ cat dates
,2018-2-1301
,2018-3-1379
,2018-1-3809
,2018-2-5801
$ while read name; do
while read date; do
n=`echo "$name" | awk '{print $1};'`
d=`echo "$date" | awk '{print $1};'`
echo "$n $d"
done < dates
done < names
Adam,2018-2-1301
Adam,2018-3-1379
Adam,2018-1-3809
Adam,2018-2-5801
John,2018-2-1301
John,2018-3-1379
John,2018-1-3809
John,2018-2-5801
Tim,2018-2-1301
Tim,2018-3-1379
Tim,2018-1-3809
Tim,2018-2-5801
Вы можете попробовать этот awk:
awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1