2015-04-24 3 views
1

Я работаю над программой, которая делает следующее:Выполнение команды для каждой строки текстового файла (Баш)

Читает 270 файлов в папке X и вызывает другую программу для запуска команды с содержимым файл. Например:

$ cat X/1.txt 
AAAA 
BBBB 
CCCC 

программа должна прочитать этот текст (есть 270 из них) и в цикле он должен делать:

$python file.py AAAA; 

затем

python file.py BBBB; 

затем

python file.py CCCC. 

и м ove в следующем файле, например 22.txt (файлы не являются числовыми, поэтому счетчик не будет очень полезен).

Я попытался следующие:

function text(){ 
for i in $(ls Domains/); 
while read line; 
do 
     $line 
     f= done < Domains/$i.txt 
     python file.py $f 
} 

text; 

Спасибо, ребята!

+0

Не так (игнорировать этот комментарий) – BretC

+0

Похоже, что каждый второй Баш-меченого вопрос я вижу здесь нужен кто-то, чтобы указать на опасность [разборе LS] (http://mywiki.wooledge.org/ParsingLs). Пожалуйста, прочитайте ссылку и не делайте то, что делаете. И читайте о 'find' и его' -exec' опции, которая находится в направлении того, что вы хотите использовать. – ghoti

ответ

2

Здесь xargs пригодится: объедините все файлы и трубы, которые в xargs, которые по очереди подают каждую строку в программу python.

cat * | xargs -L1 python file.py 
+0

Из того, что я читал в Интернете, советуем никогда не использовать кошку для таких вещей .. делает вещи беспорядочными .. но +1 для xargs! – user3610137

+0

@ user3610137: Напротив, это отличное использование 'cat'. Напротив, вы не должны этого делать: 'for i в $ (ls Domains /);' который будет терпеть неудачу, если в именах файлов есть символы пробела или glob. 'for i in *;' является предпочтительным. Если вам неважно, какой файл имеет строка, хотя, 'cat * |' прост и надежен, если только ваши каталоги не содержат в себе десятки тысяч файлов. – rici

0

Это должно работать:

function text(){ 
for i in $(ls Domains/) 
do 
while read line; 
do 
python file.py $line 
done < Domains/$i.txt 
done  
} 
+0

Можно ли выгрузить вывод для каждого файла в собственном текстовом файле? – user3610137

+0

Да, сначала соберите все выходы в переменной или в отдельном файле, а затем выгрузите их в текстовый файл после того, как текстовый файл будет использован (после цикла while). – Jahid

+0

Как? Я попытался добавить done $ i-DONE.txt, но это не работает. – user3610137

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