Добавление части file_name к каждой строке файла, рекурсивно к нескольким файлам - PullRequest
0 голосов
/ 08 февраля 2019

Итак, у меня есть несколько файлов вида

filename_date.csv

в папке, например что-то вроде

filename_2010_01_01.csv

, которые содержат, скажем, ... 1000 строк сформат вроде этого

37845287|2364532467|237849853
04568750|89345735385|94573857

Но у меня есть 365 таких файлов на весь год, по одному на каждый день.Что я хотел бы сделать, это сделать какой-то удар?Возможно, сценарий берет дату из имени файла и добавляет ее в конец каждой из строк x в каждом файле, чтобы результат был примерно таким:

filename_2010_01_01.csv

37845287|2364532467|237849853|2010_01_01
04568750|89345735385|94573857|2010_01_01

filename_2010_01_02.csv

438574|563546567|2342523525|2010_01_02
326345452|456454763|7856763|2010_01_02

Пока что я попробовал:

Я пробовал с этим

sed 's/$/|2010-01-01/' filename_2010-01-01.csv > filename_2010-01-01.csv

, который работает для одного файла.

Теперь я пытаюсь выполнить следующий цикл

FILES=~/Desktop/2010/byday/*
for f in $FILES
do
  filename=$f | cut -d'/' -f7-
done

Как только у меня есть имя файла, я могу просто добавить команду sed в цикл, но у меня возникают проблемы при создании filenamevar, чтобы получить значение команды

Если я просто выведу команду внутри цикла, она получит мне имя файла, эта команда будет только убрать путь из имени файла.

UPDATE:

Внутри цикла

  filename=`basename $f`

что короче, чище и переменная действительно получает значение

ОБНОВЛЕНИЕ 2:

Этот цикл

FILES=~/Desktop/2010/byday/*
for f in $FILES
do
  fname=`basename $f`
  fname=${fname%.csv}
  fname=${fname##filename_}
  echo $fname
  sed 's/$/|$fname/' filename_$fname.csv > filename__$fname.csv
done

На самом деле правильно выводит дату, НО что-то есть в команде sed tHat удаляет содержимое файла

ОБНОВЛЕНИЕ 3:

С этим я почти там

FILES=~/Desktop/2010/byday/*
for f in $FILES
do
  fname=`basename $f`
  fname=${fname%.csv}
  fname=${fname##partitioned.csvmerged_}
  sed 's/$/|$fname/' partitioned.csvmerged_${fname}.csv > $fname.csv
done

Он записывает новый файл с только датой в качестве имени файла (который являетсяхорошо) но я не уверен, как я должен интерполировать там переменную, так как при этом вывод в файл

438574|563546567|2342523525|$fname
326345452|456454763|7856763|$fname

1 Ответ

0 голосов
/ 09 февраля 2019

Вы перезаписываете тот же файл, который читаете.Как только оболочка анализирует команду, она начинает обрезать файл, а затем, с подготовленным выходным файлом, запускает команду sed, которая находит пустой файл.Ваша проблема будет решена путем исключения перенаправления и использования параметра -i в sed:

FILES=~/Desktop/2010/byday/*
for f in $FILES
do
    fname=$(basename "$f" .csv)
    fname=${fname##filename_}
    echo "$fname"
    sed -i "s/\$/|$fname/" "filename_$fname.csv"
done

Я также добавил несколько небольших изменений, например использование уже существующего basename для избавления отрасширение, кавычки переменных и решение вашей следующей задачи: отсутствие расширения $fname из-за использования одинарных кавычек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...