Как мне вставить файлы с одинаковыми именами из разных каталогов?

В этом случае было бы проще использовать awk :

% awk '{ print $NF }' file.txt
3

$ NF - это данные в последнем поле (столбце), разделенном пробелами, во входной записи (строке).

grep обычно используется для получения целых строк, соответствующих определенному шаблону, но некоторые реализации также могут использоваться для получения битов строк, используя флаг -o (вернет только совпадающие биты):

% grep -o '[[:digit:]]$' file.txt
3

Но для общей обработки данных в строках я бы рекомендовал awk вместо grep .

Если файл содержит другие строки менее релевантных данных:

% awk '/^severity:/ { print $NF }' file.txt

Если, кроме того, поле не находится на крайнем конце строки, вы можете использовать sed :

% sed -n '/^severity:/s/^.*not waived: \([[:digit:]]*\).*$/\1/p' file.txt
3
1
14.04.2017, 21:52
2 ответа

Если вы хотите объединить содержимое файла, вы можете сделать это

cat dir*/file1 > file1
cat dir*/file2 > file2
cat dir*/file3 > file3

Подстановочный знак заставит команду cat читать содержимое всех каталогов / файлов, соответствующих шаблону, таким образом, вы получите содержимое файлов с тем же имя во всех трех каталогах записывается в результирующий файл.

1
27.01.2020, 23:34

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

files=(dir3/*)
for p in "${files[@]}"; do 
f=${p#*/}; paste dir1/"$f" dir2/"$f" dir3/"$f" > "$f"; done

Обратите внимание, что это может быть короче, если использовать glob, чтобы shell расширил его (имена каталогов будут использоваться в лексикографическом порядке), например,

for p in "${files[@]}"; do f=${p#*/}; paste dir*/"$f" > "$f"; done
1
27.01.2020, 23:34

Теги

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