sed导致我的电脑挂起

时间:2012-01-30 18:35:59

标签: shell sed awk

我有这个漂亮的小脚本,可以很好地为我操作一些数据文件...首先它在第一个分号后删除不需要的数据,然后将数据更改为Unicode字符串,然后删除任何换行字符,最后将它改组成两个我需要使用的混合文件(a和b)。

它可以很好地处理小文件,但我现在处理的文件非常大,以至于sed挂起了。或许这就是发生的事情......我完全不确切。是否有人可以提出如何(可能?)缓冲这个或防止它挂起的建议? (我有16GB内存,文件是...... 1707772(k?我是“ls -la”ing)...太大了?)我看到100%的cpu使用情况永远不会消失。 ..只是杀死进程使窗口返回可用。

以下是代码:

#!/bin/bash
a="a";
b="b";
echo "Input Filename:";
read ifilename;
echo "Output Filename:";
read ofilename;
awk '{
    #dbg print "$0=" $0
    sub(/;.*$/, "")
    len=length($0)
    if (len == 4) {print "&#x0" $0 ";"}
    else if (len == 5) {print "&#x" $0 ";"}
    else {print "error in input: found len=" len " in XX" $0 "xx"}
}' /home/myhome/$ifilename > temp.txt;
cat temp.txt | tr -d "\n" > temp_nolfs.txt;
cat temp_nolfs.txt | sed -r 's/(.[^;]*;)/ \1 /g' | tr " " "\n" | shuf | tr -d "\n" > $ofilename$a".txt";
cat temp_nolfs.txt | sed -r 's/(.[^;]*;)/ \1 /g' | tr " " "\n" | shuf | tr -d "\n" > $ofilename$b".txt";
rm temp.txt;
rm temp_nolfs.txt;
echo "Done!";

感谢您提出的所有建议!

2 个答案:

答案 0 :(得分:2)

您的脚本需要严肃的重构。它有许多使用管道的冗余命令,可以轻松减少,例如:

  • cat temp_nolfs.txt | sed ...很容易变成sed temp_nolfs.txt ...
  • tr的所有来电都可以在awk和/或sed中处理
  • sed -i可用于消除临时文件的创建
  • 等等。

一旦完成,我确信脚本将更有效地处理大文件。

答案 1 :(得分:1)

非常感谢有用的建议;然而,这个问题根本就没有了......我一直在用无分号喂它的数据,这意味着它永远都在寻找一些不存在的东西。一旦我给它提供了正确的结构化数据,工作得很好,尽管有冗余。