Unix bash-使用文件中的cut to regex行,将regex结果与另一个类似行匹配
我有一个文本文件:file.txt,有几千行。它包含许多我不感兴趣的垃圾行,因此我首先使用cut命令来正则表达式我感兴趣的行。对于我感兴趣的每个条目,它将在文本文件中列出两次:一次在“定义”部分,另一次在“值”部分。我想从“definition”部分检索第一个值,然后为在那里找到的每个条目找到它对应的“value”部分条目 第一个条目以“gl”开头,而第二个条目看起来像“gl”,以“a”开头 这是我到目前为止在文本文档中循环的代码,然后检索我感兴趣的值并将其附加到.csv文件中:Unix bash-使用文件中的cut to regex行,将regex结果与另一个类似行匹配,bash,unix,Bash,Unix,我有一个文本文件:file.txt,有几千行。它包含许多我不感兴趣的垃圾行,因此我首先使用cut命令来正则表达式我感兴趣的行。对于我感兴趣的每个条目,它将在文本文件中列出两次:一次在“定义”部分,另一次在“值”部分。我想从“definition”部分检索第一个值,然后为在那里找到的每个条目找到它对应的“value”部分条目 第一个条目以“gl”开头,而第二个条目看起来像“gl”,以“a”开头 这是我到目前为止在文本文档中循环的代码,然后检索我感兴趣的值并将其附加到.csv文件中: while r
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
- 它使用
提取包含“gl”的所有行grep
- 然后
从包含一个“.”的行中删除前导“.”[我假设行中没有其他“.”sed
- 行已排序
从每对行中删除返回值sed
然后打印 根据您的要求选择所需的列awk
- 输出路由到文件
LANG=C sort-t\\-sd-k1,1>/filepath/file.csv
行,使sort
紧跟在gl\uu…
(“gl\u…
fixesLANG
)-假设定义出现在值之前LC\u TYPE
有助于确保定义和值匹配(如果值重复/缺失,可能仍会失败),并对awk进行整理sed
拉出相关字段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