[英]How to delete a line in a csv file after processing it with a Linux bash script
我使用 Linux bash 脚本通过 wp-cli 在我的 WordPress 网站上创建帖子。 这是我使用的脚本示例:
#! /bin/bash
while IFS="|" read -r rec_column1 rec_column2 rec_column3 rec_column4
do
cd /posts/ &&
wp post create \
--post_type=post \
--post_title="$rec_column1" \
--post_status=publish \
--post_category=2 \
--url=http://127.0.0.1/ \
--meta_input="{\"word\":\"$rec_column2\"}" \
--tags_input="$rec_column3" \
--post_content="$rec_column4"
done < <(tail -n +2 ./files/$1) > ./logs/$1.log
这是 csv 文件的示例,我从中获取数据:
title|word|tags|content
Lorem|ipsum|dolor|sit
amet|consectetur|adipiscing|elit
Maecenas|sed|condimentum|est
in|fermentum|justo|Aenean
我面临的问题是,如果帖子创建由于某种原因被中断,我将不得不查看日志文件以查看上次创建的帖子的帖子 ID 是什么,之后我将 go 转到 WordPress站点,查看最后一个帖子,在 csv 文件中找到该行,删除该行上方的所有行并重新开始。
我想改进该过程,以便在创建帖子后,删除 CSV 文件中创建该帖子的行。 所以下次后期创建过程被打断时,我将能够从它停止的地方继续它。
例如,如果进程在第一行之后停止,新的 csv 文件将如下所示:
title|word|tags|content
amet|consectetur|adipiscing|elit
Maecenas|sed|condimentum|est
in|fermentum|justo|Aenean
对于如何使这项工作像我想要的那样工作的任何建议或代码修改,我将不胜感激。
在while
循环中,将当前行号存储在变量$LINE_NUMBER
中。
创建一个 function delete_lines()
从输入文件中删除处理过的行:
delete_lines() {
sed -i "1,${LINE_NUMBER}d" ./files/$FILE_NAME
exit
}
最后,设置一个陷阱,在错误、退出或脚本中断时调用此 function:
trap delete_lines EXIT ERR INT TERM
整体解决方案:
#!/bin/bash
LINE_NUMBER=1
FILE_NAME="./files/$1"
delete_lines() {
if [[ "$LINE_NUMBER" -gt "1" ]]; then
sed -i "2,${LINE_NUMBER}d" "$FILE_NAME"
fi
exit
}
trap delete_lines ERR INT TERM
while IFS="|" read -r rec_column1 rec_column2 rec_column3 rec_column4
do
cd /posts/ &&
wp post create \
--post_type=post \
--post_title="$rec_column1" \
--post_status=publish \
--post_category=2 \
--url=http://127.0.0.1/ \
--meta_input="{\"word\":\"$rec_column2\"}" \
--tags_input="$rec_column3" \
--post_content="$rec_column4"
LINE_NUMBER=$((LINE_NUMBER+1))
done < <(tail -n +2 "$FILE_NAME") > ./logs/$1.log
delete_lines
trap delete_lines EXIT ERR INT TERM
delete_lines() {
sed -i "2,${LINE_NUMBER}d" ${FILES_DIR}/$FILE_NAME
exit
}
FILE_NAME="$1"
FILES_DIR="/path/to/files"
LOGS_DIR="/path/to/logs"
while IFS="|" read -r LINE_NUMBER rec_column1 rec_column2 rec_column3 rec_column4
do
cd /posts/ &&
wp post create \
--post_type=post \
--post_title="$rec_column1" \
--post_status=publish \
--post_category=2 \
--url=http://127.0.0.1/ \
--meta_input="{\"word\":\"$rec_column2\"}" \
--tags_input="$rec_column3" \
--post_content="$rec_column4"
done < <(awk 'NR!=1 { print NR"|"$0}' ${FILES_DIR}/${FILE_NAME}) > ${LOGS_DIR}/${FILE_NAME}.log
删除行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.