Проблема с "пока читаешь" и вставляешь

У меня 69 файлов называется *.sites.pi, Например, OC9.sites.pi, cu27.sites.pi, так далее.

Префикс каждого файла (то есть перед.sites.pi) находится в файле с именем ind_list,

$ cat ind_list
OC9
Ocu27
...

Я хочу объединить третьи столбцы всех этих файлов.

Я старался:

while read i
do
    paste <(cut -f3 $i.sites.pi) >> output
done < ind_list

Но это не работает. Как я могу заставить это работать?

3 ответа

Для вставки файлов необходимо, чтобы все элементы были переданы одновременно paste, Поскольку вы читаете файл, вам необходимо сначала сохранить содержимое где-нибудь, например, во временном файле, чтобы вы могли paste их вместе.

Поэтому я предлагаю что-то вроде этого:

i=1
while read -r file
do
    awk '{print $3}' "$file" > file.$i
    ((i++))
done < ind_list

Теперь у вас много file.XX файлы с 3-м столбцом файла.

Тогда просто используйте что-то вроде этого, где Гленн Джекман просветляет нас:

paste -d " " file.{1..69} > output

И тогда вы можете очистить все временные файлы, сказав rm file{1..69},

У меня нет терминала для проверки моего ответа, поэтому я попробую сделать слепое предположение.

Я думаю, что может быть разница в поведении между

paste <(cut -f3 Ocu27.sites.pi) <(cut -f3 OS10.sites.pi) >output

а также

paste <(cut -f3 Ocu27.sites.pi) >>output
paste <(cut -f3 OS10.sites.pi) >>output

Чтобы решить эту проблему, вы можете изменить свой первоначальный цикл на:

while read i
do
    arguments="$arguments <(cut -f3 $i.sites.pi)"
done < ind_list
eval "paste $arguments >output"

Еще одно преимущество в том, что вы выполняете paste только один раз в конце цикла и, таким образом, может иметь некоторое улучшение производительности по сравнению с вычислением вставки на каждой итерации цикла

С помощью cat а также awk

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

пример

Входные файлы

cat OC8.sites.pi

foo bar foobar

cat OC9.sites.pi

foo bar foobar

cat Ocu27.sites.pi

foobar foo bar

cat ind_list

OC8
OC9
Ocu27

Команда

cat ind_list | xargs -i'{}' awk '{print $3}' "{}.sites.pi" > output

Выходной файл

cat output

foobar
foobar
bar
Другие вопросы по тегам