首页 > 解决方案 > 如何从 CSV 中删除在 Bash 中读取的行

问题描述

我目前正在这样做:

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.

标签: bashreadline

解决方案


这里有一个没有 sed 的解决方案。

#!/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"

推荐阅读