繁体   English   中英

如何在使用 csv 脚本处理后删除 csv 文件中的一行 bash 脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM