Объединение двух файлов на основе первого столбца в зависимости от расположения определенного шаблона в файле 1

  1. git logвыводит историю Git.
  2. Канал(|)указывает оболочке передать вывод в виде потока данных в grep.
  3. grepизвлечет все строки, содержащие строку commit, из вывода git log.
  4. >перенаправляет результат grepв файл filename.txtв домашнем каталоге (~).
0
10.09.2021, 01:32
2 ответа

Если бы я знал, что представляют собой файл1, файл2 и каждый из столбцов, я бы придумал более точные имена переменных, но я этого не делаю... используя любой awk в любой оболочке на каждом Unix-сервере:

$ cat tst.awk
BEGIN { tgt = 1402 }
NR == FNR {
    file2[$1] = $0
    next
}
{
    fld = "0000"
    val = "unknown"
    for ( i=2; i<=NF; i++ ) {
        if ( $i == tgt ) {
            fld = $i
            if ( $1 in file2 ) {
                split(file2[$1],f)
                val = f[i]
            }
            break
        }
    }
    print $1, fld, val
}

$ awk -f tst.awk file2 file1
1010089 1402 26
1010121 1402 62
1305789 1402 unknown
3456889 0000 unknown
1
10.09.2021, 13:42

Попробуйте это:

  $ awk 'FNR==NR {for (ii=2;ii<=NF;ii++) if ($ii=="1402") a[$1]=ii;next} 
         {if ($1 in a) {column=a[$1]; print $1,"1402",$column}}' file1 file2
   
  1010089 1402 26
  1010121 1402 62

Это решение — одно из многих. Он довольно общий, поэтому он будет обрабатывать все ~300 тыс. строк file2даже в случае повторяющихся значений первого столбца. Значение «1402» можно поместить в любой столбец после первого в file1.

ХТХ

1
10.09.2021, 08:25

Теги

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