2015-07-21 1 views
0

У меня есть более 50000 файлов в каталоге, таком как file1.txt, file2.txt, ....., file50000.txt. Я хотел бы объединить некоторые файлы, номера файлов которых указаны в следующем текстовом файле (need.txt).Конкатенация огромного количества выборочных файлов из каталога в оболочке

need.txt 
1 
4 
35 
45 
71 
. 
. 
. 

Я пробовал со следующим. Хотя он работает, но я ищу более простой и короткий путь.

n1=1 
n2=$(wc -l < need.txt) 
while [ $n1 -le $n2 ] 
do 
f1=$(awk 'NR=="$n1" {print $1}' need.txt) 
cat file$f1.txt >> out.txt 
((n1++)) 
done 

ответ

2

Что-то, как это должно работать для вас:

sed -e 's/.*/file&.txt/' need.txt | xargs cat > out.txt 

Он использует СЭД, чтобы перевести каждую строку в соответствующее имя файла, а затем передает имена файлов в xargs, чтобы передать их cat.

Использование AWK это можно сделать так:

awk 'NR==FNR{ARGV[ARGC]="file"$1".txt"; ARGC++; next} {print}' need.txt > out.txt 

который добавляет каждый файл в ARGV массив файлов для обработки, а затем печатает каждую строку, он видит.

+0

спасибо. Не могли бы вы предложить мне, если я объединю больше файлов подобного рода. например файл $ 1.txt и infile $ 1.txt – Kay

+1

Если все имена следуют одному и тому же шаблону и вы хотите, чтобы все они были в одном и том же выходном файле, просто добавьте больше записей в 'ARGV' в awk-решении (т. е. добавьте' ARGV [ARGC] = «infile» $ 1 «.txt», ARGC++ 'к блоку). Выполнение этого в 'sed' потребовало бы игры с удерживающим пространством, чтобы дублировать строки, которые я считаю. –

3

Это может также работать для вас:

sed 's/.*/file&.txt/' < need.txt | xargs cat > out.txt 
2

Это можно сделать это без каких-либо SED или AWK команду. Непосредственно использовать встроенные функции bash и кошку (конечно).

for i in $(cat need.txt); do cat file${i}.txt >> out.txt; done 

И как вы хотите, это довольно просто.

Смежные вопросы