如何从TSV文件中正确提取第一列?解决awk提取仅显示首字符问题
解决awk提取第一列仅显示首字符的问题
我来帮你搞定这个头疼的问题!你遇到的这种情况,九成是分隔符设置不符合文件实际情况导致的,咱们一步步排查解决:
1. 先确认文件的真实分隔符
你给的示例内容看起来是空格分隔(Harry_Potter 1 Lord_of_the_rings 10...),但你用了-F"\t"指定制表符作为分隔符——如果文件实际是空格分隔,awk会把整行当成第一列,而之所以只显示首字符,大概率是你输入命令时,\t没有被shell正确解析成制表符,反而被当成了普通的t字符!
这时候你可以直接用awk的默认分隔符(它会自动识别任意空白字符:空格、制表符、连续空格都算),命令简化成:
awk '{print $1}' inputs.tsv
这个命令应该能直接提取到每一行的第一列内容,比如Harry_Potter、Lord_of_the_rings这些。
2. 如果文件确实是制表符分隔
那问题出在你输入\t的方式上。在很多shell里,双引号包裹的\t不会被解析为制表符,而是被当成字符串\t。这时候你可以直接输入真实的制表符:
- 在终端里先按
Ctrl+V,再按Tab键,这样就能输入一个真实的制表符 - 命令变成这样(注意
-F后面的是真实制表符,不是\t):
awk -F' ' '{print $1}' inputs.tsv
3. 用工具验证分隔符
如果还是不确定,用cat -A命令查看文件的不可见字符:
cat -A inputs.tsv
这个命令会把制表符显示为^I,空格就是空格,换行符显示为$,能让你一眼看清文件的真实分隔符是什么。
4. 特殊情况:Windows格式的文件
如果你的文件是Windows系统生成的,可能带有CRLF换行符(\r\n),这时候可以先转成Unix格式再处理:
dos2unix inputs.tsv awk '{print $1}' inputs.tsv
内容的提问来源于stack exchange,提问作者Saeko
相关产品推荐
相关产品推荐

