根据第一个单词对行进行分组

use*_*694 4 grep sed awk text-processing

如何修改文件的以下内容:

cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3
dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
Run Code Online (Sandbox Code Playgroud)

到 :

cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
Run Code Online (Sandbox Code Playgroud)

它不是特定于狗或猫的,它更像是第一个单词/术语的象征性表示

Sté*_*las 11

你可以这样做:

awk -F: 'NR>1 && $1 "" != last {print ""}; {print; last = $1}'
Run Code Online (Sandbox Code Playgroud)

""是力量字符串比较。没有它,它将无法在输入中正常工作,例如:

100:foo
100:bar
1e2:baz
1e2:biz
Run Code Online (Sandbox Code Playgroud)

Where1001e2将作为数字进行比较。


ste*_*eve 7

这是一种方法。如果第一个字段与前一行中的字段不同,则打印一个中断....

$ awk -F: '$1!=a&&a{print ""}{a=$1}1' myfile
cat:persian/young-1
cat:winter/young-2
cat:summer/wild-3

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
$
Run Code Online (Sandbox Code Playgroud)

解释:

  • -F: = 将字段分隔符设置为 :
  • $1!=a&&a = 如果第一个字段不等于变量“a”(前一个第一个字段),并且变量“a”设置为某个值(即我们不处理文件中的第一行)
  • {print ""} = 打印一个空行
  • {a=$1} = 对于每行读取,将变量“a”设置为第一个字段
  • 1 = 打印行