use*_*550 4 shell awk text-processing
我有文件:
key value
blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1
Run Code Online (Sandbox Code Playgroud)
我这样做是为了删除重复的行:
awk '/man1/ { print $1,$2} ' file | awk '!x[$0]++'
Run Code Online (Sandbox Code Playgroud)
并且该命令取第一行并忽略其他行
man1 boy1
man1 boy2
Run Code Online (Sandbox Code Playgroud)
但我想忽略除最后一行之外的所有行:
man1 boy2
man1 boy1
Run Code Online (Sandbox Code Playgroud)
正如ramesh所说,我想要这样的东西:
cat filename
blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1
man1 boy2
man1 boy3
man1 boy4
man1 boy2
Run Code Online (Sandbox Code Playgroud)
所需的输出
man1 boy1
man1 boy3
man1 boy4
man1 boy2
Run Code Online (Sandbox Code Playgroud)
tac filename |awk '/man1/ { print $1,$2} '| awk '!x[$0]++' | tac
Run Code Online (Sandbox Code Playgroud)
测试
我想用更具体的输入进行测试。所以,我的测试如下。
cat filename
blah blah
blah blah
blahblah
man1 boy1
blah blah
man1 boy2
man1 boy1
man1 boy2
man1 boy3
man1 boy4
man1 boy2
Run Code Online (Sandbox Code Playgroud)
现在,我运行上面的命令并得到输出,
tac filename |awk '/man1/ { print $1,$2} '| awk '!x[$0]++' | tac
man1 boy1
man1 boy3
man1 boy4
man1 boy2
Run Code Online (Sandbox Code Playgroud)
根据 Steeldriver 的建议,我们可以将其修改awk
为更简单,因为,
tac filename | awk '/^man1/ && !x[$2]++' | tac
Run Code Online (Sandbox Code Playgroud)
您可以使用此 shell 脚本执行此操作:
#!/bin/bash
awk '/man1/{pos[$0] = NR}
END {
for(key in pos) reverse[pos[key]] = key
for(nr=1;nr<=NR;nr++)
if(nr in reverse) print reverse[nr]
}' yourfile
Run Code Online (Sandbox Code Playgroud)
输出:
[root@host ~]# sh shell.sh
man1 boy1
man1 boy3
man1 boy4
man1 boy2
Run Code Online (Sandbox Code Playgroud)