查找并替换shell脚本以创建可用的csv文件

时间:2016-04-16 10:19:08

标签: shell batch-file sh

我有一个大问题。我用测量程序进行了很多测量。我得到几个* .SP8文件,它们只不过是文本文件。使用Automator,我可以重命名所有* .csv。

我现在需要一个清除我前29行内容的脚本。然后脚本必须用分号替换所有空格。

脚本必须在所有子文件夹中的指定文件夹中找到所有csv文件。

理想情况下,它会在一行中找到第一个空格,并用分号替换它,并清除行中的其余部分。

文件看起来像:

Test
22.01.2016
..
Tester
20160122_BM_BLANK

User

20160122_BM_BLANK
Text
@@6.000 5.350   1.000   12.000  8.500   1020.000    60.000  940.000 4.773   0.000   1.500   14.800  0.000   100.000 0.000   9.000   0
@@SWB 533 [blank]
blank
SK 999100.10
no


100Nm.SEN
100 Nm 
Last 01/2013
SN: "HBM,Spider8-55/01,08231,P32"






1200
7200
0   -0.015238   0   -0.0465 0
0   -0.015238   0   -0.0465 0.000833
0   -0.025  0   -0.0465 0.001667
... following 6000 lines of code like this ...
384.5   -0.025  0   -0.0465 5.9975
384.5   -0.025  0   -0.0465 5.998333
384.5   -0.025  0   -0.0465 5.999166

End

这应该变成这个:

0;-0.015238
0;-0.015238
0;-0.025
... following 6000 lines of code like this ...
384.5;-0.025
384.5;-0.025
384.5;-0.025

目标是在EXCEL中加载它并创建图形

3 个答案:

答案 0 :(得分:1)

tailsed

tail -n +30 file | sed 's/^\([^ ]*\) \+\([^ ]* \).*/\1;\2/;/^$/{N;/End/d}'

tail删除前29行。

sed搜索并捕获以非空格字符开头的字符串,后跟一个或多个空格,后跟非空格字符后跟一个空格。两个捕获的组之间都输出;

/^$/{N;/End/d}删除了End行。

以递归方式将上述命令应用于从当前目录开始的所有.csv文件:

find . -name "*.csv" -print0 -exec sh -c 'tail -n +30 {} | sed "s/^\([^ ]*\) \+\([^ ]* \).*/\1;\2/;/^$/{N;/End/d}" > {}.new' \;

所有过程文件都将以.new扩展名为后缀。

答案 1 :(得分:1)

使用JREPL.BAT regular expression find/replace utility,一个纯脚本实用程序(混合JScript /批处理),可以在XP以后的任何Windows机器上本机运行:

@echo off
pushd "yourRootPath"
for /f "eol=: delims=" %%F in (
  'findstr /smc:" " *.csv'
) do call jrepl " +" ";" /a /jbegln "skip=(ln<30)" /f "%%F" /o -
popd

FINDSTR命令查找并列出包含空格的所有.CSV文件(已转换的文件将不再有空格)。

FOR / F命令迭代每个结果文件。

JREPL.BAT完成剩下的工作

  • 搜索/替换使用单个;
  • 替换每个连续空格
  • /a仅打印更改的行
  • /jbegln ...忽略前29行
  • /f "%%F"指定源文件
  • /o -使用结果
  • 覆盖原始文件

更新2018/10/03

从JREPL v4.0开始,可以通过/EXC选项忽略前29行,而不是通过/JBEGLN选项使用用户提供的JScript。

) do call jrepl " +" ";" /a /exc 1:29 /f "%%F" /o -

另外,我刚刚意识到OP只想保留每行的前2个值,而我的原始代码保留了所有值。对find / repl字符串的简单更改应该可以解决问题:

) do call jrepl " +([^ ]+)" ";$1" /a /exc 1:29 /f "%%F" /o -

答案 2 :(得分:1)

我编写了这个完美完成工作的php脚本:

<?php
$base = "BM_BLANK_";

for ($i = 1; $i <= 1; $i++) {
  $myfile = fopen($base.$i.".txt", "r") or die("Kann Datei nicht öffnen!");
  $arr = explode(PHP_EOL, substr(strstr(fread($myfile, filesize($base.$i.".txt")),"1200"),12,-8));
  foreach($arr as $key => $value) {
    $new[$key] = explode("  ", $value);
    unset($new[$key][2]);
    unset($new[$key][3]);
    unset($new[$key][4]);
  }
  $newfile = fopen($i.".csv", "w");
  $txt = "";
  foreach($new as $sch => $wert) {
    $txt .= $wert[0].";".$wert[1]."\n";
  }
  fwrite($newfile, $txt);
  fclose($newfile);
  fclose($myfile);
}
?>