linux - 验证文本文件显示每个数据集的预期字段

标签 linux bash command-line-interface sh

如果有这种格式的文档:

Data point 1:
    field 1:
    field 2:
    field 3:

Data point 2:
    field 1:
    field 2:
    field 3:

Data point 3:
etc...

您可以通过滚动文件中的数千行来手动验证每个数据点的每个字段是否存在,但这样做效率低下且耗时。

我考虑过拆分文件并使用 diff 比较每个部分,但同样,如果行数或格式存在差异,这将很容易出现问题。

那么您将如何处理文件并验证每个点的编号和预期字段是否正确?

最佳答案

创建一个以 : 开头的 bash 脚本

#!/bin/bash

在该脚本中,创建一个从标准输入中读取的函数,检查单个“记录”中的每个字段,如下所示:

check_record()
{
   local LINE
   IFS= read -r LINE
   [[ "$LINE" =~ ^[[:space:]]*field 1: ]] || return 1
   IFS= read -r LINE 
   [[ "$LINE" =~ ^[[:space:]]*field 2: ]] || return 1
   ...
}

如果记录正常,函数返回 0(真),否则返回 1。

然后创建一个函数来搜索指示记录开始的行:

find_records()
{
   local LINE
   while IFS= read -r LINE
   do
     [[  "$LINE" =~ ^Data ]]  || continue
     check_record || echo "Bad record: $LINE"
   done
}

最后,添加一行(在最后,在两个函数之外),将文件作为第一个参数传递给该函数。

find_records <"$1"

您可能想要添加错误检查,数据文件中允许或不允许的内容(例如空行)的详细信息可能会有所不同,但这应该传达基本思想。

请注意使用了特定于 bash 的 [[ ]] 条件和 =~ 模式匹配,如果您需要解释请询问。

关于linux - 验证文本文件显示每个数据集的预期字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41667447/

相关文章:

linux - 从 McPat 输出到另一个目录不起作用

linux - 如何拆分变量以在行之间打印出其他内容?

linux - 剪切匹配并放在另一个位置

PHP CLI 进程在退出时永远挂起

linux - 使用包括 Lapack 在内的 CMake 将 Fortran 库从 Linux 交叉编译到 Windows

bash & Printf : How can I both right pad and truncate?

linux - 是否有同时适用于 linux 和 mac OS 的命令来确定操作系统版本?

linux - Grep:在 HEREDOC 中查找文本

node.js - 我们如何找到当前在 Node JS 项目中使用的已弃用方法的列表?

python - 如何将输出更新到命令行而不打印到新行?