如何修改文件的以下内容:
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
其中100
和1e2
将作为数字进行比较。
答案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
打印该行内容(总是)。