这可能是许多常见问题解答 - 而不是使用:
cat file | command
Run Code Online (Sandbox Code Playgroud)
(这被称为无用的猫),正确的方式应该是:
command < file
Run Code Online (Sandbox Code Playgroud)
在第二,"正确"的方式 - 操作系统不必产生额外的过程.
尽管知道这一点,我继续使用无用的猫有两个原因.
更美观 - 我喜欢数据仅从左到右均匀移动.而且它更容易更换cat别的东西(gzcat,echo,...),添加第二个文件或插入新的过滤器(pv,mbuffer,grep...).
我"觉得"在某些情况下可能会更快.更快,因为有2个进程,1st(cat)执行读取而第二个执行任何操作.它们可以并行运行,这意味着有时可以更快地执行.
我的逻辑是否正确(第二个原因)?
我有一个约400mb的电子邮件转储.我想将其拆分为.txt文件,每个文件中包含一封邮件.每封电子邮件都以指定doctype的标准HTML标头开头.
这意味着我将不得不根据上述标题拆分我的文件.我如何在linux中进行操作?
我有这个file.csv:
coordinate1,coordinate2,value1
11111,a1,65
11111,a2,32
22222,b1,39
22222,b3,55
33333,c5,12
33333,c9,16
coordinate1,coordinate2,value2
54656,a1,65
21342,a2,32
23543,b1,39
123123,b3,55
568568,c5,12
568568,c9,16
123123,b3,55
568568,c5,12
568568,c9,16
coordinate1,coordinate2,value3
23543,b1,39
123123,b3,55
568568,c5,12
568568,c9,16
123123,b3,55
23543,b1,39
123123,b3,55
568568,c5,12
568568,c9,16
123123,b3,55
11111,a1,65
11111,a2,32
22222,b1,39
22222,b3,55
33333,c5,12
33333,c9,16
Run Code Online (Sandbox Code Playgroud)
现在我想将这个文件分成3个文件,每个人只有数据块
Es: 1° file
coordinate1,coordinate2,value1
11111,a1,65
11111,a2,32
22222,b1,39
22222,b3,55
33333,c5,12
33333,c9,16
Es: 2° file
coordinate1,coordinate2,value2
54656,a1,65
21342,a2,32
23543,b1,39
123123,b3,55
568568,c5,12
568568,c9,16
123123,b3,55
568568,c5,12
568568,c9,16
Run Code Online (Sandbox Code Playgroud) 嗨,大家好,我希望这个主题足够清楚,我在前面提到过的bin中没有找到任何具体的内容.我试过在Perl或Python中实现它,但我想我可能会努力.
是否有一个简单的shell命令/管道将基于开始和结束正则表达式将我的4mb .txt文件拆分成单独的.txt文件?
我提供了以下文件的简短示例..因此您可以看到每个"故事"都以短语"X XXX of XXX DOCUMENTS"开头,可以用来分割文件.
我认为这应该很容易,如果bash不能这样做我会感到惊讶 - 比Perl/Py更快.
这里是:
1 of 999 DOCUMENTS
Copyright 2011 Virginian-Pilot Companies LLC
All Rights Reserved
The Virginian-Pilot(Norfolk, VA.)
...
3 of 999 DOCUMENTS
Copyright 2011 Canwest News Service
All Rights Reserved
Canwest News Service
...
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
罗斯
我使用电子表格gem来做到这一点.它有效,但有时可能会非常慢.我甚至尝试过Roo宝石,但这并没有改善性能.有没有更好的方法来完成这项工作?奇怪的是,同一个excel中的一些工作表工作得更快,一些工作表工作得非常慢,甚至需要长达1个小时.
我们可以使用开放式办公室在单个Excel中打开每个工作表(选项卡)并将它们更快地转换为csv吗?如果是的话,我将如何在红宝石中做到这一点?
还是有更好的解决方案?
刚刚添加了一个我尝试使用Roo gem的小例子
xls = Roo::Excel.new(source_excel_file)
xls.each_with_pagename do |name, sheet|
# p sheet.to_csv(File.join(dest_csv_dir,name + ".csv"))
#sheet.parse(:clean => true)#.to_csv(File.join(dest_csv_dir,name + ".csv"))
puts name
puts sheet.parse(:clean => true)
end
Run Code Online (Sandbox Code Playgroud) 一个简单的测试脚本:
while read LINE; do
LINECOUNT=$(($LINECOUNT+1))
if [[ $(($LINECOUNT % 1000)) -eq 0 ]]; then echo $LINECOUNT; fi
done
Run Code Online (Sandbox Code Playgroud)
当我这样做时cat my450klinefile.txt | myscript,CPU锁定为100%,并且每秒可以处理大约1000行.大约5分钟处理cat my450klinefile.txt >/dev/null半秒钟的事情.
有没有更有效的方法来实现这一点.我只需要从stdin读取一行,计算字节数,然后将其写入命名管道.但即便是这个例子的速度也很慢.
每1Gb的输入行我需要做一些更复杂的脚本操作(关闭并打开一些数据被输入的管道).
我一直在寻找一种有效地实现这一目标的方法,并且无法提出最佳解决方案.
要求很简单.我有一个以下格式的文件.
$cat mymainfile
rec1,345,field3,....field20
rec1,645,field3,....field20
rec12,345,field3,....field20
frec23,45,field3,....field20
rec34,645,field3,....field20
Run Code Online (Sandbox Code Playgroud)
在拆分操作结束时,我希望有多个具有这些名称的单独文件
$cat some_prefix_345_some_suffix_date
rec1,345,field3,....field20
rec12,345,field3,....field20
$cat some_prefix_645_some_suffix_date
rec1,645,field3,....field20
rec34,645,field3,....field20
$cat some_prefix_45_some_suffix_date
frec23,45,field3,....field20
Run Code Online (Sandbox Code Playgroud)
我想过使用grep,但它必须找到唯一的id然后grep为每个,因为我们不知道在读取之前文件中的id(345,645等)mymainfile.
然后我想到csplit这里例如这里基于分隔符将一个文件拆分成多个文件但是它基于分隔符而不是特定列分割.
当谈到bash脚本时,我知道我可以使用a逐行读取while loop并拆分它但不知道它是否会有效.
我也想过awk像awk '$2 == ? {等等的解决方案,但不知道如何获得这些不同的文件名.我可以使用python以编程方式执行它,但更喜欢单个命令行,我知道这是可能的.我厌倦了搜索,但仍然无法找到最佳方法.任何建议/最佳方法将不胜感激.