使用 awk 在第一个字母表中更改后插入空行

使用 awk 在第一个字母表中更改后插入空行

bash我正在为地址簿编写脚本。现在一切正常,只是当字母表更改时我无法用空行分隔字母记录。我有一个文件,排序后用 awk 给出,输出如下:

Anand Anju
Anand Sanjay
Das Ajay
Deshpande Shweta
Kanetkar Ashok
Kanetkar Jyoti
Sabane Dhananjay
Sahani Surinder

我想生成如下所示的输出;

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

我想要一个使用的解决方案awk

答案1

用于awk选取当前输入行的第一个字符。如果与上一行的第一个字符不同,则输出一个空行。记住这一行的第一个字符,然后输出当前行。这样,如果第一个字符与上一行的第一个字符发生变化,您将在每行之前输出一个空行。

$ awk '{ cur = substr($0,1,1) } NR > 1 && cur != prev { print "" } { prev = cur; print }' file
Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

答案2

其他awk解决方案:

awk 'NR>1 && a && substr($1,1,1)!=a{ print "" }{ a=substr($1,1,1) }1' file

  • substr($1,1,1)- 从第一个字段中提取第一个字符

答案3

awk '{A[$1]++;if(A[$1]==1){printf("\n")}}1' FS= file

答案4

我们将下一行累积到模式空间中,并将模式空间的第一个字符与模式空间中最后一行的第一个字符进行比较。

当匹配时,我们在模式空间中再追加一行。现在,如果我们遇到 eof,我们会立即 quit ( N) 命令执行它,这就是为什么我们不使用 a 前缀$!来利用此功能。

否则,我们在块的末尾放置一个换行符。

假设使用 GNU sed。

sed -e '
   :a;N
   /^\(.\).*\n\1[^\n]*$/ba
   h;s/\(.*\n\).*/\1/p
   g;s/.*\(\n\)/\1/;D
' file.txt

结果

Anand Anju
Anand Sanjay

Das Ajay
Deshpande Shweta

Kanetkar Ashok
Kanetkar Jyoti

Sabane Dhananjay
Sahani Surinder

相关内容