有没有办法向表格添加换行符以创建子组?

Dav*_*nan 4 text-processing

我很难弄清楚如何表达这个,所以 Google-fu 失败了。

我有一个带有数据表的文本文件。我想插入换行符以在视觉上分隔子组。

例如,如果我开始:

jan   ford
jan   trillian
mar   trillian
sep   marvin
Run Code Online (Sandbox Code Playgroud)

第一个字段是我的子组字段,那么输出应该是:

jan   ford
jan   trillian

mar   trillian

sep   marvin
Run Code Online (Sandbox Code Playgroud)

我可以做一些事情,比如^(a-z){3}\t(.*)\n\1\t(.*)$确定月份相同的两条线,但我不知道当它们不同时如何匹配。

理想情况下,我希望这是一个我可以投入 BBedit 的正则表达式,但我对其他解决方案持开放态度。

ter*_*don 5

它看起来像是bbedit某种付费的 OSX 编辑器。恐怕我从未使用过它,也无法安装它,所以我无法在那里为您提供帮助。根据您显示的正则表达式,它有自己的正则表达式语法,因此您不太可能在使用它的通用 *nix 站点上找到解决方案。但是,这里有几个其他选项。在两者中,想法是保存第一个字段并打印一个空行,如果它与前一行中看到的不同:

$ awk '{if($1!=last && NR>1){print ""}last=$1;}1;' file
jan ford
jan trillian

mar trillian

sep marvin
Run Code Online (Sandbox Code Playgroud)

awk是一种脚本语言,旨在处理基于字段的数据。它将自动将每一行拆分为字段,然后可以将其称为$1, $2... $N。因此,上面的脚本将保存变量中的第一个字段last,对于除第一行以外的每一行(这就是NR>1意思),如果last与当前保存的值不同,它将打印一个空行。该1;是AWK简写“打印每一行”。

或者,您也可以在perl

$ perl -lape '$F[0] ne $last && $.>1 && print ""; $last=$F[0]' file
jan ford
jan trillian

mar trillian

sep marvin
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用perl命令行开关来完成大部分工作。该-a品牌perlawk和每个输入行分割成阵列@F。因此,$F[0]是第一个字段。该-l品牌perl一个新行添加到每个print调用,因此print ""只是打印一个空行。这-p使它在应用由-e. 脚本本身与awk上面的完全相同。