Командная строка колдовства - PullRequest
3 голосов
/ 28 июля 2011

У меня есть каталог, полный файлов .xls, которые я хочу преобразовать в .csv.Я использую xls2csv.Эта команда только выводит csv на экран, поэтому я считаю, что вам нужно выполнить xls2csv (файл xls)> (новый файл) .csv.Поэтому для этого мне нужно написать цикл.

for f in `ls`; do xls2csv > `rev $f` | cut -d "." | rev | echo ".csv"

Это то, что у меня есть, и оно не работает.Я просто надеюсь, что вы можете точно понять, что я хочу сделать на примере выше.

Ответы [ 5 ]

9 голосов
/ 28 июля 2011
for f in *.xls; do
  basename="${f%.xls}"
  csvname="$basename.csv"
  xls2csv "$f" > "$csvname"
done

[update] исправил опечатку, так что $basename фактически используется. Спасибо.

1 голос
/ 30 июля 2011

GNU Parallel имеет функцию для этого: {.}, Которая является исходной строкой, но с удалением .extension:

ls | parallel xls2csv {} ">" {.}.csv

Кроме того, вы получаете дополнительный бонус за параллельную работу xls2csv, если у вас несколько процессоров. Он также правильно обрабатывает имена файлов, такие как:

My Brother's 12" records.xls

Чтобы узнать больше, смотрите вступительное видео: http://www.youtube.com/watch?v=OpaiGYxkSuQ

0 голосов
/ 28 июля 2011

Попробуйте это

type=".csv";
for f in `ls -1`;
do
file=`echo $f|cut -d '.' -f1`
file=${file}${type}
`xls2csv $f > $file`
done
0 голосов
/ 28 июля 2011

Вы должны проверить команду basename, используя переключатель -s.

(я думаю, что вы используете rev для изменения имени файла - это правильно? Я удалил его.)

for f in `ls`; do
     xls2csv $f > `basename -s xls $f`csv;
done

Попробуйте это.Я не знаю, является ли xls2csv деструктивным (как sed), поэтому сделайте резервную копию вашего каталога.

0 голосов
/ 28 июля 2011
for f in *; do
    c=`echo $f | sed 's/.xls$/.csv/'`
    xls2csv $f >$c
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...