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

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

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

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

到 :

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

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

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

答案1

你可以这样做:

awk -F: 'NR>1 && $1 "" != last {print ""}; {print; last = $1}'

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

100:foo
100:bar
1e2:baz
1e2:biz

其中1001e2将作为数字进行比较。

答案2

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

$ 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
$

解释:

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

答案3

我尝试用这种方式

en ~]# awk '/cat/{print $0}' filename| sed '$s/.*/&\n/g';awk '/dog/{print $0}' filename

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

dog:persian/young-1
dog:winter/young-2
dog:summer/wild-3
[root@praveen ~]#

答案4

可以用 awk 来完成:

awk -F: ' $0!="" && last!="" && $1!=last"" {print""} {last=$1} 1'
  • -F :用于分割:字符上的字段。

  • $0 != ""需要避免将一个空行转换为三个空行。
    这允许重新处理已处理的文件,而无需添加空行。

  • last != ""需要避免文件第一行(最后一行为空)。

  • $1 != last""将当前第一个字段与前一个字段进行比较。
    尾随""确保比较是在文本模式下完成的。否则,等价的(至awk)数值将被视为相等,例如:

    7:first line
    7e0:second line
    7.0000:third line
    7.000000000000000000008:fourth line
    
  • {print""}打印一个空行(如果上面的所有测试都匹配)。

  • {last=$1}将行第一个字段存储在变量 中last

  • 1打印该行内容(总是)。

相关内容