如何在ubuntu中检查txt文件的分隔符



我有.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

相关内容

  • 没有找到相关文章

最新更新