我有.txt文件,我想检查它们的分隔符。文件可能有分隔符选项卡、管道(|(和逗号
制表符分隔文件
ID Name Email
1 Test a@test.com
2 testone b@test.com
逗号分隔
ID,Name,Email
1,Test,a@test.com
2,testone,b@test.com
对于上面的示例数据,我想获得分隔符。所以第一个样本的分隔符是tab,第二个分隔符是逗号(,(
这实际上是一个非常好的问题,我也想看看其他人的解决方案。这是在自动处理sh***y数据时需要解决的问题:
awk '
FNR==1 { # process the header record
line=$0 # duplicate to leave $0 usable
gsub(/[^,|t]/,"",line) # remove non-candidates
split(line,a,"") # split leftovers
delete b # ... since FNR...
max=prev=0 # reset
for(i in a) # flip a and count hits
b[a[i]]++
for(i in b) # find max amount of hits
if(b[i]>=b[max]) {
prev=max
max=i
}
if(b[prev]==b[max]) { # if count collision
print "Multiple candidates for delimiter. Exiting."
exit 1
}
# below: output
printf "Delimiter: %sn",(max=="t"?"\t":(max==" "?"[space]":max))
exit
}' file
例如输出:
Delimiter: t
您不能确定,请考虑以下内容:
test,test|test,test|test
test,test|test,test|test
但你可以有一个很好的估计。我会解析文件的一个示例,例如前10行,脚本如下:
BEGIN {
sep[","] = "comma"
sep["\|"] = "pipe"
sep["t"] = "tab"
}
{
for (x in sep) {
c = gsub(x,"&",$0)
if (c) cnt[sep[x] " " (c+1)]++
}
}
END {
for (x in cnt) {
if (max == "" || cnt[x] > max) {
max = cnt[x]
est = x
}
}
print est
}
其中,我们计算候选分隔符出现N次(不包括0次(的行,并将文件中发生最多的情况作为最佳猜测。
示例用法:
head file | awk -f tst.awk
它打印估计的分隔符和估计的字段数。示例:
> cat file
1,2,3
1,2,3
> awk -f tst.awk file
comma 3
如何查找分隔符的规则尚不清楚。找到的第一个分隔符由给出
# Substitute a tab for the space in the next command
grep -Eom1 "[,| ]" file | head -1
也许你想要ID
:之后的角色
sed -rn '1s/..(.).*/1/p' file
# Or after a word
sed -rn '1s/w*(.).*/1/p' file