Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/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
Json 从bash中的许多文件中检索、编辑和存储数据的最有效方法_Json_Bash_File_Parsing - Fatal编程技术网

Json 从bash中的许多文件中检索、编辑和存储数据的最有效方法

Json 从bash中的许多文件中检索、编辑和存储数据的最有效方法,json,bash,file,parsing,Json,Bash,File,Parsing,所以我在.log文件中有一堆数据。这些列是用制表符分隔的,但我只需要第2列和第7列的数据(虽然不能保证第7列中总是有数据,而且第7列之后有更多的列。在这种情况下,第8列之前会有一个双制表符) 我目前的方法非常慢,我觉得一定有更好的方法,因为我比应该的更频繁地浏览数据 #First I iterate through all the files and att them to data.raw.log cat $f >> data.raw.log #Then cut

所以我在.log文件中有一堆数据。这些列是用制表符分隔的,但我只需要第2列和第7列的数据(虽然不能保证第7列中总是有数据,而且第7列之后有更多的列。在这种情况下,第8列之前会有一个双制表符)

我目前的方法非常慢,我觉得一定有更好的方法,因为我比应该的更频繁地浏览数据

   #First I iterate through all the files and att them to data.raw.log
   cat $f >> data.raw.log
   #Then cut out unneeded data.
   cut -f2,7 data.raw.log > data.log
   #I then need to parse the data into JSON
   while IFS=$'\t' read -r -a entry
   do
     if [ ! -z  ${entry[1]} ]; then
       echo "FORMATTED JSON HERE WITH ${entry[0]} AND ${entry[1]}" >> data.json
     fi
   done < data.log
#首先,我遍历所有文件并将它们发送到data.raw.log
cat$f>>data.raw.log
#然后删除不需要的数据。
cut-f2,7 data.raw.log>data.log
#然后我需要将数据解析为JSON
而IFS=$'\t'读取-r-a项
做
如果[!-z${entry[1]}];然后
echo“此处使用${entry[0]}和${entry[1]}格式化JSON”>>data.JSON
fi
完成

明显的问题是,我要对数据进行两次剪切,然后在只需要一次的情况下进行添加。这被证明是非常缓慢的,任何关于速度提高的想法都会很有帮助。

好的,所以您将数据剪切成一个文件,然后解析该文件。这有点冗长。不仅如此,还需要首先将所有数据从一个文件复制到另一个文件

您可以通过一个小小的awk脚本实现同样的效果:

 $ cat file*.log | awk -F'\t' '{if ($7 != "") print "Formatted data here with " $1 " and " $7}' >output.log
Awk将输入作为令牌$1和$7(制表符分开),并检查$7是否为空。如果没有,则按您喜欢的格式打印数据。

使用
awk

awk -F'\t' '$7 != "" { print "FORMATTED JSON HERE WITH " $2 " AND " $7 }' * > data.json

这里,我假设所有文件都在当前目录中。您应该能够轻松地调整此设置以适应文件的实际位置。

当您进入
awk
时,为什么要在字段上使用
cut
?Awk非常适合加工领域。告诉它tab是一个分隔符。因为我对awk了解不够,所以不知道-F参数;)Awk还可以在命令行上获取多个文件
awk'script'file1.log file2.log file3.log
。看起来正确的答案是两个现有答案的组合。我将优化我的文件,使其更好地处理多个文件,因此必须从cat still进行管道传输。这错误地假设,如果至少有7列,则必须打印该文件-而不是筛选第7列(即使有7列以上)为空的条目。谢谢!真的有助于加快速度!您不需要将所有文件合并到一个文件中。只需对每个文件执行剪切命令。循环文件,如'files=`ls*.log;以$files表示的文件;做切割指令;“完成;”。分号表示新行。