LINUX.ORG.RU

Ответ на: комментарий от ashot

Никогда не следует начинать паттерн с метасимволов, нужно писать ./* например , а ещё переменную следует писать как "$i" — обязательно в кавычках.

Да и вообще лучше применить find:

find dir -maxdepth 1 -mindepth 1 -type f -execdir sh -c 'cut -f2- -d\  "{}" > "{}.new"' \;

Примерно так.

Xenius ★★★★★
()
Ответ на: комментарий от ashot

Зачем? Есть же нормальные операционки. А винду даже в интернет выпускать без внешнего файерволла нельзя.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

new файлы остались такими же как и исходники. Я не понимаю, какой у меня разделитель между столбцами, если честно. А можно сделать подобное через указание нужных столбцов в awk {print $2,$3,$4,$5,$6} или глупая затея?

Hi
() автор топика
Последнее исправление: Hi (всего исправлений: 2)
Ответ на: комментарий от Hi

Можно поменять разделитель, тут пробел, а у тебя может быть другой. Через awk тоже можно.

head -n 1 file | od -An -ta

Так можешь посмотреть какой там символ-разделитель.

Xenius ★★★★★
()
Ответ на: комментарий от Xenius
$ head -n 1 "1.txt" | od -An -ta
   2   1   8  ht   1   5  ht   1   6  ht   5  ht   4   5   5   4
  ht   2   0   0   3   1   .   1  cr  nl

Примерно такие данные в файлах у меня.

218	15	16	5	4554	20031.1

Не могу понять. Какой разделитель использовать. -d «ht» это 2 символа ведь?

С awk я пробовал так, но так не работает

find ./ -maxdepth 1 -mindepth 1 -type f -execdir sh -c 'awk {print $2,$3,$4,$5,$6} "{}" > "{}.new"' \;

Hi
() автор топика
Ответ на: комментарий от Xenius

притом awk print подефолту меняет любой разделитель на пробел, но с find совместить его не получается

Hi
() автор топика
Ответ на: комментарий от Niroday
$ head -n 1 "1.txt"
218	15	16	5	4554	20031.1

Это напоминает разделение tab'ом, но как tab написать как делиметр, я не вкурсе.

Hi
() автор топика
Ответ на: комментарий от Hi

По таблице ASCII, ht - horizontal tab. Поробовал у себя:

cat /tmp/test | od -An -ta
   1   2   3  ht   2   3   3  ht   1   2   1   2  ht   1   2   1
   2  nl
Для одного файла будет:

awk -F"\t" '{for (i=2; i<NF; i++) printf $i" "; print $NF}' /tmp/test

Niroday
()
Ответ на: комментарий от Hi

Забыл еще одно. Чтобы в итоге делиметр сохранить, надо вместо

printf $i" "

printf $i"\t"
Niroday
()
Ответ на: комментарий от Niroday

Спасибо. Просто пробовал этот делитель с cut, не получилось. for я понял, спасибо. но у меня всегда с 2 по 6 столбец: print $2,$3,$4,$5,$6 Я с find'ом awk не могу склеить, что б из каждого файла вырезать первый столбец и поменять делитель на пробел. (я, вообще, так данные под RStudio готовлю)

Hi
() автор топика
Ответ на: комментарий от Xenius
$ find ./ -maxdepth 1 -mindepth 1 -type f -execdir sh -c 'cut -f2- -d$'\t'  "{}" > "{}.new"' \;
cut: разделитель должен быть одним символом

не получается что-то

Hi
() автор топика
Ответ на: комментарий от Xenius

Работает, если нажать Ctrl-v + Tab

cut -f2 -d " "

Hi
() автор топика
Ответ на: комментарий от Xenius

Всем спасибо. Проблема решина.

find ./ -maxdepth 1 -mindepth 1 -type f -execdir sh -c 'cut -f2- -d "   "  "{}" > "{}.new"' \;
Hi
() автор топика
Ответ на: комментарий от Hi

С заменой в итоге не пробел

for f in $(find -maxdepth 1 -mindepth 1 -type f); do awk -F"\t" '{for (i=2; i<NF; i++) printf $i" "; print $NF}' $f > $f.new; done

Niroday
()
Ответ на: комментарий от Hi

не получается что-то

А ну да, точно... Проблема экранирования внутренних ' ' конечно. Можно её решить конструкцией

$'\''\t'\''

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Никогда не следует начинать паттерн с метасимволов, нужно писать ./* например...Да и вообще лучше применить find:

Это вы сами выдумали? Может и доказать сможете, чем лучше?

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.