Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix bash-使用文件中的cut to regex行,将regex结果与另一个类似行匹配_Bash_Unix - Fatal编程技术网

Unix bash-使用文件中的cut to regex行,将regex结果与另一个类似行匹配

Unix bash-使用文件中的cut to regex行,将regex结果与另一个类似行匹配,bash,unix,Bash,Unix,我有一个文本文件:file.txt,有几千行。它包含许多我不感兴趣的垃圾行,因此我首先使用cut命令来正则表达式我感兴趣的行。对于我感兴趣的每个条目,它将在文本文件中列出两次:一次在“定义”部分,另一次在“值”部分。我想从“definition”部分检索第一个值,然后为在那里找到的每个条目找到它对应的“value”部分条目 第一个条目以“gl”开头,而第二个条目看起来像“gl”,以“a”开头 这是我到目前为止在文本文档中循环的代码,然后检索我感兴趣的值并将其附加到.csv文件中: while r

我有一个文本文件:file.txt,有几千行。它包含许多我不感兴趣的垃圾行,因此我首先使用cut命令来正则表达式我感兴趣的行。对于我感兴趣的每个条目,它将在文本文件中列出两次:一次在“定义”部分,另一次在“值”部分。我想从“definition”部分检索第一个值,然后为在那里找到的每个条目找到它对应的“value”部分条目

第一个条目以“gl”开头,而第二个条目看起来像“gl”,以“a”开头

这是我到目前为止在文本文档中循环的代码,然后检索我感兴趣的值并将其附加到.csv文件中:

while read -r line
do
    if [[ $line == gl_* ]] ; then (param=$(cut -d'\' -f 1 $line) | def=$(cut -d'\' -f 2 $line) | type=$(cut -d'\' -f 4 $line) | prompt=$(cut -d'\' -f 8 $line))
    while read -r glline
    do
        if [[ $glline == '"'$param* ]] ; then val=$(cut -d'\' -f 3 $glline) |
        "$project";"$param";"$val";"$def";"$type";"$prompt" >> /filepath/file.csv
    done < file.txt
done < file.txt
因此,while循环有效地读取每一行,直到它到达以“gl_”开头的第一行,然后将该值(即gl_one)存储为变量“param”。 然后,它启动嵌套的while循环,该循环查找gl_前面以“.”开头的行,该行相当于“param”值 脚本应该将行glu-one和“gl-one、gl-two和”gl-two、gl-two和“gl-two”耦合起来

文本文件很大,这些都是以这种方式定义的设置。我需要收集每个gl_uu参数的值,将它们与相应的“gl_u”值一起保存在.csv文件中

想要的存储在变量中的正则表达式输出如下:

第一个while循环: $param=gl_one,$def=User Defined,$type=String,$prompt=Some Text

第二个while循环: $val=Value1

然后使用分号分隔符将这些变量存储到.csv文件中

目前,我对第一个“完成”语句有一个错误,这似乎表明引号有问题。除此之外, 我正在寻找脚本的一般想法和注释。也就是说,我不完全确定我在寻找引号参数“gl_u”是否正确,或者 正确添加了分号作为.csv分隔符

编辑:总体而言,脚本现在运行,但由于内部while循环,速度非常慢。有没有更快的方法将这两行匹配在一起并将它们添加到.csv文件中


有什么想法和意见吗?

这将生成一个包含所需数据的文件:

cat file.txt | grep gl|sed-E“s/\”/“/”;sort | sed'$!N;s/\N/\/“;awk-F'''''''''{print$1“;“$5”;“$7”;“$NF}>/filepath/file.csv

  • 它使用
    grep
    提取包含“gl”的所有行
  • 然后
    sed
    从包含一个“.”的行中删除前导“.”[我假设行中没有其他“.”
  • 行已排序
  • sed
    从每对行中删除返回值
  • awk
    然后打印 根据您的要求选择所需的列
  • 输出路由到文件
LANG=C sort-t\\-sd-k1,1>/filepath/file.csv
  • sort
    行,使
    gl\uu…
    紧跟在
    “gl\u…
    LANG
    fixes
    LC\u TYPE
    )-假设定义出现在值之前
  • sed
    有助于确保定义和值匹配(如果值重复/缺失,可能仍会失败),并对awk进行整理
  • awk
    拉出相关字段

如果。。。。;然后。。。。;fi
您还可以添加所需的输出。验证您的脚本。快速查看一下,您可能需要为while循环使用不同的
fd
,不管它是内部循环还是外部循环。他们只需要使用不同的
fd
。文件目录应该是正确的,只是在上面的示例中不明确。谢谢,我将在链接站点检查脚本。内部while循环和if语句是否可以以某种方式替换为grep语句?我发现内部while循环对于系统来说太麻烦了,因为它现在运行了20多分钟来循环每一行的所有行。似乎“gl_uu”和“gl_u”是您所搜索的项目的唯一相关信息。‘一’、‘二’、‘三’等只是例子,还是可以是别的?干杯!我要试着用这个。这不会删除源文件。txt?
cat
只读取文件内容并输出它。它是完全无损的。你的
排序
在某些情况下可能会将值放在定义之前。我认为如果“用户定义”的值小于“1”是可能的,或者你发现了其他东西吗?我想它会按数字排序,不是吗?我非常确定在1之前排序的唯一值是:0/-,+*)(“&%$#”!和空格。您是否忽略了文件不包含示例中的行这一事实?如果该行没有开始
gl
,则会被删除(
D
)。啊。这很有意义。感谢您的澄清。
gl_one\User Defined\1\String\1\\1\Some Text 
gl_two\User Defined\1\String\1\\1\Some Text also 
gl_three\User Defined\1\Time\1\\1\Datetime now
some\junk 
"gl_one\1\Value1 
some\junk 
"gl_two\1\Value2
"gl_three\1\Value3
LANG=C sort -t\\ -sd -k1,1 <file.txt |\
sed '
  /^gl_/{             # if definition
    N;                #   append next line to buffer
    s/\n"gl_[^\\]*//; #   if value, strip first column
    t;                #   and start next loop
  }
  D;                  # otherwise, delete the line
' |\
awk -F\\ -v p="$project" -v OFS=\; '{print p,$1,$10,$2,$4,$8 }' \
>>/filepath/file.csv