我有像
这样的文件123|3a|3b
747|3a|3b|3c|3d
636|3c|3b
输出:
123 -3c 3d
636 -3a 3d
它应该比较3a,3b,3c,3d
并显示缺失的那个。
我尝试使用
awk '/3a/3b/3c/3d' file.txt
但无法弄清楚如何比较单个字符串。
答案 0 :(得分:0)
这个awk-solution应该完成这项工作
awk -F\| 'BEGIN{OFS=" "}{str=""
str=sub("3a",$0) ? str : str"3a"
str=sub("3b",$0) ? str : str"3b"
str=sub("3c",$0) ? str : str"3c"
str=sub("3d",$0) ? str : str"3d"
if(str != ""){gsub(/[abdc]/,"& ",str)
$0=$1" -"str
print $0}}' test
限制:第一列不得包含" a"," b"," c"或" d"。
输出:
123 -3c 3d
636 -3a 3d
如果" - "更强大不是必需的:
awk -F\| '{str=""
str=sub("3a",$0) ? str : str"3a"
str=sub("3b",$0) ? str : str"3b"
str=sub("3c",$0) ? str : str"3c"
str=sub("3d",$0) ? str : str"3d"
if(str != ""){gsub("3"," 3",str)
print $1""str}}' test
输出:
123 3c 3d
636 3a 3d
答案 1 :(得分:0)
$ cat list
3a,3b,3c,3d
$
$ cat file
123|3a|3b
747|3a|3b|3c|3d
636|3c|3b
$
$ cat tst.awk
NR==FNR {
for (i=1; i<=NF; i++) {
reqd[++numReqd] = $i
}
next
}
{
c=0
for (i=1; i<= numReqd; i++) {
if ( $0 !~ "[|]" reqd[i] "([|]|$)" ) {
printf "%s%s%s%s", (++c>1?"":$1), OFS, (c>1?"":"-"), reqd[i]
}
}
if (c) {
print ""
}
}
$
$ awk -f tst.awk FS=',' list FS='|' file
123 -3c 3d
636 -3a 3d