我有一个格式如下的文件:
text number number A;A;A;A;A;A
text number number B
text number number C;C;C;C;D;C;C;C;C
我想要做的是删除第四列中条目的所有重复以最终结果:
text number number A
text number number B
text number number C;D
我更喜欢使用bash脚本来获得一个解决方案,以适应我正在对此文件进行其他文本操作的管道。
谢谢!
答案 0 :(得分:3)
可以使用awk
实现此目的。将字段4拆分为数组使用;第一
awk '{delete z; d=""; split($4,arr,";");for (k in arr) z[arr[k]]=k; for (l in z) d=d";"l; print($1,$2,$3,substr(d, 2))}' file_name
答案 1 :(得分:2)
这可能适合你(GNU sed):
sed 's/.*\s/&\n/;h;s/.*\n//;:a;s/\(\([^;]\).*\);\2/\1/;ta;H;g;s/\n.*\n//' file
答案 2 :(得分:2)
假设以制表符分隔的输入,您可以使用GNU parallel进行这样的操作:
parallel -C '\t' c4='$(echo {4} | tr ";" "\n" | sort -u | head -c-1 | tr "\n" ";");' \
echo -e '"{1}\t{2}\t{3}\t$c4"' :::: infile
输出:
text number number A
text number number B
text number number C;D
答案 3 :(得分:1)
这可能也有用
awk -F";" '{
delete words
match($1,/[[:alpha:]]$/)
words[substr($1,RSTART,RLENGTH)]++
printf "%s",$1
for (i=2;i<=NF;i++){
if (!words[$i]++) printf ";%s",$i
}
printf "\n"
}' file
注意:
由于;
用作字段分隔符,因此A;A;A;A;A;A
/[[:alpha:]]$/
可以替换为/[^[:space:]]+$/
,以匹配多个非空格字符,而不是单个字母。
if (!words[$i]++) printf ";%s",$i
打印列/字符(如果它不存在作为关联数组words
的键,即如果words[$i]
为0。