我有一个带有字符串和描述的制表符界定的 .csv。有点像这样:
strap tight
elba Island
foo bar
able Cain
parts buy
able Cain
首先,我按选项卡之前所有内容的长度对文件进行排序:
parts buy
strap tight
able Cain
able Cain
elba Island
few many
然后,我删除完全相同的重复项:
parts buy
strap tight
able Cain
elba Island
few many
但是,我仍然需要删除字谜重复项 —部分和带子有相同的字母。也如此厄尔巴岛和有能力的。
parts buy
able Cain
few many
并回显对话框警告...类似:
关于如何最好地做到这一点有什么想法吗?
编辑:
下面的一些答案:
- 这是针对 Mac 操作系统的
- 我只关心 1 美元的匹配
- $1 中不会有任何大写(但 $2 中会有)
- $1中不会有重复的字母
这是我现在使用的代码:
# print length+iii before every line
awk '{printf "%diii%s\n", length($1), $0}' < file.txt > /tmp/out && mv /tmp/out file.txt
# remove exact duplicates
sort -u < file.txt > /tmp/out && mv /tmp/out file.txt
# remove non-identical duplicates
# awk '{magic}' < file.txt > /tmp/out && mv /tmp/out file.txt
# varDupeEcho=remainder from above
# sort by size
sort -n -r -k1,1 < file.txt > /tmp/out && mv /tmp/out file.txt
#remove lengths
sed -i "" -E -e 's/^[0-9]+iii//' file.txt
# warn about duplicates
osascript -e "display dialog \"Duplicates found!\n\n$varDupeEcho\" --> Result: \{button returned:\"OK\"\}"
答案1
以任意顺序比较值的一般方法是对各部分进行排序以创建用于比较的键,例如使用 GNU awk 表示“sorted_in”,并使用 null 3rd arg 来 split() 将字符串拆分为字符:
$ cat tst.awk
BEGIN {
PROCINFO["sorted_in"] = "@val_str_asc"
OFS = "\t"
}
{
key = ""
split($1,chars,"")
for (i in chars) {
key = key tolower(chars[i])
}
print key, $0
}
$ awk -f tst.awk file | sort -k1,1 -u | cut -f2-
elba Island
strap tight
foo bar
您可以一次一步地查看正在执行的操作,以便清楚地了解:
$ awk -f tst.awk file
aprst strap tight
abel elba Island
foo foo bar
abel able Cain
aprst parts buy
abel able Cain
$ awk -f tst.awk file | sort -k1,1
abel able Cain
abel able Cain
abel elba Island
aprst parts buy
aprst strap tight
foo foo bar
$ awk -f tst.awk file | sort -k1,1 -u
abel elba Island
aprst strap tight
foo foo bar
我看到您在问题中添加了一个声明,表明您使用的是 MacOS - 好的,只需在那里安装 GNU awk 即可。您可以使用其他 awks 执行上述操作,但需要生成一个 shell 来为每个输入行上的关键字符调用 Unix 排序,这将非常慢(并且编写起来有点麻烦)值,或者您必须实现自己编写一个排序算法,编写起来会很麻烦,而且当您可以快速轻松地安装 gawk 然后您就可以解决这个问题和未来的问题时,所有这些都不值得。