如何在 Bash 中读取时从 CSV 中删除行
How to delete line from CSV as they are read in 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
,如果它们被删除,它会弄乱当前行。所以我想知道如何正确地做到这一点。
如何遍历每行 <path>
的 CSV 文件,并在成功添加 git 后删除路径。似乎您需要有一个循环来从文件中选择第一行,然后将其从文件中删除,而不是使用 while read line
.
你可以使用 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
这是一个没有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"
我目前正在这样做:
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
,如果它们被删除,它会弄乱当前行。所以我想知道如何正确地做到这一点。
如何遍历每行 <path>
的 CSV 文件,并在成功添加 git 后删除路径。似乎您需要有一个循环来从文件中选择第一行,然后将其从文件中删除,而不是使用 while read line
.
你可以使用 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
这是一个没有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"