1

我需要使用 shell 脚本根据较大文件中模式的最后一次出现将较大的文件拆分为较小的块。例如。

Sample.txt(文件将根据要搜索的模式的第三个字段进行排序)

NORTH EAST|0004|00001|Fost|Weaather|<br/> 
NORTH EAST|0004|00001|Fost|Weaather|<br/> 
SOUTH|0003|00003|Haet|Summer|<br/> 
SOUTH|0003|00003|Haet|Summer|<br/> 
SOUTH|0003|00003|Haet|Summer|<br/> 
EAST|0007|00016|uytr|kert|<br/> 
EAST|0007|00016|uytr|kert|<br/> 
WEST|0002|00112|WERT|fersg|<br/> 
WEST|0002|00112|WERT|fersg|<br/>
SOUTHWEST|3456|01134|GDFSG|EWRER|<br/> 

“Pattern 1 = 00003”要搜索的输出文件必须包含sample_00003.txt

NORTH EAST|0004|00001|Fost|Weaather|<br/> 
NORTH EAST|0004|00001|Fost|Weaather|<br/>
SOUTH|0003|00003|Haet|Summer|<br/> 
SOUTH|0003|00003|Haet|Summer|<br/> 
SOUTH|0003|00003|Haet|Summer|<br/> 

"Patren 2 = 00112" 要搜索的输出文件必须包含 sample_00112.txt

EAST|0007|00016|uytr|kert|<br/> 
EAST|0007|00016|uytr|kert|<br/> 
WEST|0002|00112|WERT|fersg|<br/> 
WEST|0002|00112|WERT|fersg|<br/> 

用过的

awk -F'|' -v 'pattern="00003"' '$3~pattern big_file' > smallfile

和 grep 命令,但由于文件大小为 300+ MB,因此非常耗时。

4

2 回答 2

2

不确定您是否会找到比 更快的工具,但这里有一个变体可以修复您自己的尝试,并且通过使用字符串匹配而不是正则表达式awk匹配来加快速度。

它在循环中处理查找值,并将从上一次迭代停止的位置到手头值的最后一次出现的所有内容输出到名为 的文件smallfile<n>,其中<n>是以 开头的索引1

ndx=0; fromRow=1
for val in '00003' '00112' '|'; do  # 2 sample values to match, plus dummy value
  chunkFile="smallfile$(( ++ndx ))"
  fromRow=$(awk -F'|' -v fromRow="$fromRow" -v outFile="$chunkFile" -v val="$val" '
    NR < fromRow { next }
    { if ($3 != val) { if (p) { print NR; exit } } else { p=1 } } { print > outFile }
  ' big_file)
done

请注意,虚拟值|确保在要匹配的最后一个真值之后的任何剩余行也保存到块文件中。


请注意,将所有逻辑移动到单个awk脚本中应该更快,因为big_file只需读取一次

awk -F'|' -v vals='00003|00112' '
  BEGIN { split(vals, val); outFile="smallfile" ++ndx }
  { 
    if ($3 != val[ndx]) { 
      if (p) { p=0; close(outFile); outFile="smallfile" ++ndx } 
    } else { 
      p=1 
    } 
    print > outFile
  }
' big_file
于 2017-01-26T04:52:54.797 回答
0

您可以尝试使用 Perl:

 perl -ne '/00003/ && print' big_file > small_file

并将其时间与其他解决方案进行比较...

编辑

将我的答案限制在您尚未尝试过的工具上……您还可以使用:

sed -n '/00003/p' big_file > small_file

但我倾向于相信 perl 会更快。再次......我建议您自己测量不同解决方案的经过时间。

于 2017-01-26T04:32:59.727 回答