Проблема с "пока читаешь" и вставляешь
У меня 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