Помещение команды внутри awk для объединения столбцов разных файлов

Если вы пытаетесь получить информацию о том, сколько места было занято при установке, комбинация yum whatprovides и yum info поможет вам в этом.

yum whatprovides sed
sed-4.2.2-5.el7.x86_64 : A GNU stream text editor
Repo        : rhel-7-server-rpms

yum info sed-4.2.2-5.el7.x86_64 ##CHECK Size:
Installed Packages
Name        : sed
Arch        : x86_64
Version     : 4.2.2
Release     : 5.el7
Size        : 587 k
Repo        : installed
From repo   : anaconda
Summary     : A GNU stream text editor
URL         : http://sed.sourceforge.net/
License     : GPLv3+
Description : The sed (Stream EDitor) editor is a stream or batch (non-interactive)
            : editor.  Sed takes text as input, performs an operation or set of
            : operations on the text and outputs the modified text.  The operations
            : that sed performs (substitutions, deletions, insertions, etc.) can be
            : specified in a script file or from the command line.
0
04.07.2019, 17:43
5 ответов

Чистыйawk:

awk '
    FNR==NR{c[NR]=$2}
    FNR!=NR{$1 = $1 OFS c[FNR]; print}
' file2 file

Выход:

1 b 2 3 4 
5 d 5 6 
7 f 7 7 7 9 10
1
28.01.2020, 02:30

Попробуйте выполнить следующую команду

awk 'FNR==NR{b[FNR]=$2;next}{print $1,b[FNR],$2,$3,$4,$5,$6,$7}' file2.txt  file1.txt 
0
28.01.2020, 02:30

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

$ awk '(getline line < "file2.txt") > 0 {split(line,a); $1 = $1 FS a[2]} 1' file1.txt
1 b 2 3 4
5 d 5 6
7 f 7 7 7 9 10

В качестве альтернативы вы можете использовать pasteи cut, полностью избегая awk


  1. см., например, Использование getline из конвейера
0
28.01.2020, 02:30

Как насчет небольшого вырезания и вставки?

paste -d" " <(cut -d" " -f1 file1.txt) <(cut -d" " -f2 file2.txt) <(cut -d" " -f2- file1.txt)
1
28.01.2020, 02:30

В Perl вы читаете строку из файла 1, а затем читаете строку из файла 2 через стандартный ввод. Затем сшейте линии в желаемом порядке.

 $ perl -pale '$_ = join "\t", shift @F, <STDIN> =~ /\S\s+(\S+)/, @F' file1.txt < file2.txt

Выход:

 1  b   2   3   4
 5  d   5   6
 7  f   7   7   7   9   10
0
28.01.2020, 02:30

Теги

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