Mic*_*ael 4 command-line awk text-processing
以下输入:
A 13
A 12
B 17
C 33
D 344
C 24
A 5
C 99
Run Code Online (Sandbox Code Playgroud)
我只想获取第一列唯一的行:
B 17
D 344
Run Code Online (Sandbox Code Playgroud)
一个解决方案awk会很好,但其他的东西也是可以接受的。
如果你不介意打乱顺序,那么
sort <file> | uniq -uw 1
Run Code Online (Sandbox Code Playgroud)
请参阅man uniq了解更多信息,但这里是重要的部分。
-u, --unique
only print unique lines
-w, --check-chars=N
compare no more than N characters in lines
Run Code Online (Sandbox Code Playgroud)
如果你想要awk
awk '
$1 in ARR{
ARR[$1] = RS;
next;
}
{
ARR[$1] = $0;
}
END{
for(i in ARR)
if(ARR[i] != RS)
print ARR[i];
}
' file
Run Code Online (Sandbox Code Playgroud)
该脚本将行放入数组 ARR 中,第一个字段作为索引,整行作为值。如果数组已经有相同的索引值更改为 «\n»(新行)符号。在文件结束后打印那些值不等于 «\n» 的数组元素后,会
被告知 awk 的RS变量newline默认是相等的。
或者你可以通过sed 来完成
sort file |
sed '
:a;
$!N;
s/\(\S\+\s\).*\n\1.*/\1\a/;
ta;
/\a/P;
D;
'
Run Code Online (Sandbox Code Playgroud)
与awk:
awk 'NR==FNR { a[$1]++ } NR!=FNR && a[$1]==1' file file
Run Code Online (Sandbox Code Playgroud)
(文件名被传递两次)。
编辑:如果文件来自stdin您需要一个临时副本。像这样的东西:
tmp="$( mktemp -t "${0##*/}"_"$$"_.XXXXXXXX )" && \
trap 'rm -f "$tmp"' 0 HUP INT QUIT TERM || exit 1
... | tee "$tmp" | awk '...' - "$tmp"
Run Code Online (Sandbox Code Playgroud)