Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash 使用sed格式化大型文件_Bash_Unix_Awk_Sed - Fatal编程技术网

Bash 使用sed格式化大型文件

Bash 使用sed格式化大型文件,bash,unix,awk,sed,Bash,Unix,Awk,Sed,我有一个4.5GB的测试文件,我正在尝试格式化它 首先,我尝试用“,”替换选项卡,并用”分隔每个列字段 其次,我正在用awk和sed格式化文件中的日期字段 以下是我正在使用的: 有关格式设置: cat test_sample.csv | sed -e 's/"/""/g' | sed -e 's/\t/","/g' | sed -e 's/$/"/g' | sed -e 's/^/"/' > test_sample.csv 截止日期: awk 'BEGIN{FS=OFS="\",\""}

我有一个4.5GB的测试文件,我正在尝试格式化它

首先,我尝试用“,”替换选项卡,并用
分隔每个列字段

其次,我正在用awk和sed格式化文件中的日期字段

以下是我正在使用的:

有关格式设置:

cat test_sample.csv | sed -e 's/"/""/g' | sed -e 's/\t/","/g' | sed -e 's/$/"/g' | sed -e 's/^/"/' > test_sample.csv
截止日期:

awk 'BEGIN{FS=OFS="\",\""} NR>1{cmd = "date -d \"" $10 "\" \"+%Y-%m-%d\"";cmd | getline out; $10=out; close("uuidgen")} 1' test_sample.csv > _report.tmp && mv _report.tmp test_sample.csv
这些命令对于小文件运行正常,但失败,正在清除文件中的所有数据


有人能帮我格式化这个文件吗?

他们也会清除小文件,因为重定向首先发生,所以文件会被截断并保持为空

考虑:

$ cat file.txt
A line of text
$ cat file.txt > file.txt
$ cat file.txt      # Empty!
为了避免这种情况,您必须复制到一个临时文件中–sed中的
-i
选项可以为您执行此操作。它可以选择使用扩展名:

sed -i.bak '...'
这可以解决文件截断问题

至于其他方面:

  • 不要像这样多次给sed打电话:

    sed 's/pattern1/replacement1/' file | sed 's/pattern2/replacement2/' | ...
    
    这将通过完整的文件对每个命令执行,使过程变得更慢。请改用以下方法:

    sed 's/pattern1/replacement1/;s/pattern2/replacement2/...'
    
    只处理文件一次

  • 您不必使用
    cat
    将管道插入sed:sed将文件名作为参数,您可以避免这种情况。如果您将命令组合在一起并避免所有管道,则更是如此,请参见下文
  • 不要将sed和awk结合起来。根据经验,如果你在任何地方使用awk,你就不需要sed
组合的单通道就地sed命令可能如下所示1:

并将所有内容简化为单个awk命令(不再是一个线性程序友好命令,但肯定比组合sed和awk更快):

awk'BEGIN{OFS=“,”}
NR>1{
gsub(/“/,“\”\”)

对于(i=1;i它们也会清除小文件,因为重定向首先发生,所以文件会被截断并保持为空

考虑:

$ cat file.txt
A line of text
$ cat file.txt > file.txt
$ cat file.txt      # Empty!
为了避免这种情况,您必须复制到一个临时文件中–sed中的
-i
选项可以为您执行此操作。它可以选择使用扩展名:

sed -i.bak '...'
这可以解决文件截断问题

至于其他方面:

  • 不要像这样多次给sed打电话:

    sed 's/pattern1/replacement1/' file | sed 's/pattern2/replacement2/' | ...
    
    这将通过完整的文件对每个命令执行,使过程变得更慢。请改用以下方法:

    sed 's/pattern1/replacement1/;s/pattern2/replacement2/...'
    
    只处理文件一次

  • 您不必使用
    cat
    将管道插入sed:sed将文件名作为参数,您可以避免这种情况。如果您将命令组合在一起并避免所有管道,则更是如此,请参见下文
  • 不要将sed和awk结合起来。根据经验,如果你在任何地方使用awk,你就不需要sed
组合的单通道就地sed命令可能如下所示1:

并将所有内容简化为单个awk命令(不再是一个线性程序友好命令,但肯定比组合sed和awk更快):

awk'BEGIN{OFS=“,”}
NR>1{
gsub(/“/,“\”\”)

对于(i=1;我虽然同意您的所有答案,但我不认为将sed的输出管道化到另一个管道会带来太多的开销,而不是使用
链接它们。因为在这两种情况下,sed都会将该行放回模式空间进行修改。@jaypalsingh如果每一行上都有替换,则会产生不同(管道和使用
)之间没有太大区别,或者整个文件中只有很少的部分(由于多次处理整个文件而产生大量开销),所以我要说的是,有些情况下它们是相似的,有些情况下管道速度较慢,但没有一个情况下管道速度较快——为什么不养成习惯,总是使用可能更快的管道呢?对,我不是说管道速度会更快,只是不太确定这是否会显著减慢速度。我个人也不喜欢管道,所以我没什么可抱怨的。
:)
所有伟大的建议都应该解决OP的问题。@jaypalsingh谢谢!我从来没有真正测试过这种差异,但看到它会很有趣。@EdMorton呃,我假设其他地方发生了一些需要它的魔法,就像OP最初的awk命令一样;)虽然我同意你的所有回答,但我不认为与使用
链接sed相比,将sed的输出管道化到另一个管道会带来太多开销。因为在这两种情况下,sed都会将行放回模式空间进行修改。@jaypalsingh如果每一行上都有替换,则会产生不同(管道和使用
)之间没有太大区别,或者整个文件中只有很少的部分(由于多次处理整个文件而产生大量开销),所以我要说的是,有些情况下它们是相似的,有些情况下管道速度较慢,但没有一个情况下管道速度较快——为什么不养成习惯,总是使用可能更快的管道呢?对,我不是说管道速度会更快,只是不太确定这是否会显著减慢速度。我个人也不喜欢管道,所以我没什么好抱怨的。
:)
所有伟大的建议都应该解决OP的问题。@jaypalsingh谢谢!我从来没有真正测试过这种差异,但看到它会很有趣。@EdMorton呃,我假设其他地方需要它,就像OP最初的awk命令一样;)你有(或者你能安装吗时间函数的GNU awk?您可能不需要调用date和getline,因此您的脚本效率可以提高几个数量级。如果您将问题编辑为包含简明、可测试的示例输入和预期输出,我们可以帮助您。实际上,此时您可能希望将其作为一个单独的后续问题,因为您已经接受了d这个问题的答案。你有(或可以安装)吗时间函数的GNU awk?您可能不需要调用date和getline,因此您的脚本效率可以提高几个数量级。如果您将问题编辑为包含简明、可测试的示例输入和预期输出,我们可以帮助您。实际上,此时您可能希望将其作为一个单独的后续问题,因为您已经接受了我想知道这个问题的答案。