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