样本文件:
# cat test1
-rw-r--r-- 1 root root 19460 Feb 10 03:56 catalina.2015-02-10.log
-rw-r--r-- 1 root root 206868 May 4 15:05 catalina.2015-05-04.log
-rw-r--r-- 1 root root 922121 Jun 24 09:26 catalina.out
-rw-r--r-- 1 root root 0 Feb 10 02:27 host-manager.2015-02-10.log
-rw-r--r-- 1 root root 0 May 4 04:17 host-manager.2015-05-04.log
-rw-r--r-- 1 root root 2025 Feb 10 03:56 localhost.2015-02-10.log
-rw-r--r-- 1 root root 8323 May 4 15:05 localhost.2015-05-04.log
-rw-r--r-- 1 root root 873 Feb 10 03:56 localhost_access_log.2015-02-10.txt
-rw-r--r-- 1 root root 458600 May 4 23:59 localhost_access_log.2015-05-04.txt
-rw-r--r-- 1 root root 0 Feb 10 02:27 manager.2015-02-10.log
-rw-r--r-- 1 root root 0 May 4 04:17 manager.2015-05-04.log
Run Code Online (Sandbox Code Playgroud)
预期产出:
catalina
host-manager
localhost
localhost_access_log
manager
Run Code Online (Sandbox Code Playgroud)
尝试1(工作):
# awk '{split($9,a,"."); print a[1]}' test1 | awk '!z[$i]++'
catalina
host-manager
localhost
localhost_access_log
manager
Run Code Online (Sandbox Code Playgroud)
尝试2(工作):
# awk '{split($9,a,"."); print a[1]}' test1 | uniq
catalina
host-manager
localhost
localhost_access_log
manager
Run Code Online (Sandbox Code Playgroud)
尝试3(失败):
# awk '{split($9,a,"."); a[1]++} {for (i in a){print a[i]}}' test1
1
2015-02-10
log
1
2015-05-04
log
1
out
.
.
.
Run Code Online (Sandbox Code Playgroud)
题:
我想拆分第9个字段,然后只显示uniq条目.但是,我想在一个单行中做到这一点awk.在第三次尝试时寻求帮助.
另一个更惯用awk的单线:
awk '!a[ $0 = substr($NF,1,index($NF,".")-1) ]++' file
Run Code Online (Sandbox Code Playgroud)
或者,更明确地表达:
awk '{$0=substr($NF,1,index($NF,".")-1)} !a[$0]++' file
Run Code Online (Sandbox Code Playgroud)
!a[$0]++的重复数据删除技巧.$0改为:substr($NF,1,index($NF,".")-1)
$NF直到第一个点(.) - 有substr()一些帮助index()此解决方案的一个好处是您无需等到整个文件被解析.拆分字段是重复数据删除并即时打印.