Как пропустить первый файл и распечатать каждую строку в первом файле рядом со всеми строками во втором файле с помощью AWK?

Из руководства 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

После выполнения команды с ! $ , нажмите , и вы получите результат ! $ .

2
09.02.2019, 02:38
3 ответа
$ 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 ' '.

1
27.01.2020, 22:02

Как насчет этого?

$ 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
1
27.01.2020, 22:02

Вы можете попробовать этот awk:

awk 'NR==FNR{a[NR]=$0;b=NR;next}{for(i=1;i<=b;i++)print $0 a[i]}' File2 File1
1
27.01.2020, 22:02

Теги

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