Как удалить строки из CSV, как они читаются в Bash - PullRequest
0 голосов
/ 29 мая 2019

В настоящее время я делаю это:

while read l
do
  echo git add $l/
  git add $l/
  # sed -i -e '1,1d' data/commit-folders.csv
  # echo git commit -am "'Autocommit'"
  # git commit -uno -am "'Autocommit'"
  # echo git push origin master
  # git push origin master
done < data/commit-folders.csv

По существу просто git add <folder> для списка папок в файле CSV.Я хотел бы, чтобы это было более надежным, так как каждый раз, когда он перезапускается, он перезапускается с того места, где он остановился.Поэтому я добавил закомментированную строку, которая удаляет на месте sed -i -e '1,1d' data/commit-folders.csv.Однако, с while read line, это портит текущую строку, если они удаляются.Поэтому мне интересно, как это сделать правильно.

Как перебрать CSV-файл с <path> в каждой строке и удалить путь после успешного добавления git.Похоже, вам нужен цикл, который выбирает первую строку из файла, а затем удаляет ее из файла, а не с помощью while read line.

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Вот решение без сед.

#!/bin/bash
csv="data/commit-folders.csv"
done="$(mktemp)"

# autoremove tempfile at exit
trap 'rm "$done"' EXIT

# loop over all lines in csv
while read -r file; do
   printf "git add %s\n" "$file"
   git add "$file"

   # write processed files in tempfile
   printf "%s\n" "$file" >> "$done"

   #...
done < "$csv"

# create tempfile for merge result
newfile="$(mktemp)"

# sort: merge and sort $cvs with $done
# uniq -u: write only unique files into tempfile
sort "$csv" "$done" | uniq -u > "$newfile" 

# override $csv with tempfile
mv "$newfile" "$csv"
0 голосов
/ 29 мая 2019

вы можете использовать sed -i "/${l}/d", он найдет точную строку и удалит ее.Это предполагает, что не будет повторяющихся строк.

while read l
do
  echo git add $l/
  git add $l/
  # sed -i -e '1,1d' data/commit-folders.csv
  sed -i "/${l}/d" data/commit-folders.csv
  # echo git commit -am "'Autocommit'"
  # git commit -uno -am "'Autocommit'"
  # echo git push origin master
  # git push origin master
done < data/commit-folders.csv
...