我对AWK的字段分隔符有问题,输入文件如下所示
1\x{e76f}\x{e76f}同义词 1+* 细菌/细菌 2/ Monera / Monera -部分 2_ Procaryotae _ Procaryotae _Procaryotae_in-第二部分 2:原核生物 2%原核生物部分 细菌,细菌
这里的字段分隔符是选项卡、管道、选项卡\t|\t,所以在我尝试只打印第一列和第二列时
awk -F'\t|\t' '{print $1 "\t" $2}' nodes.dmp | less与期望的输出不同,输出是第一列,后面是管道字符。我尝试转义管道\t\|\t,但是输出保持不变。
1% 1% 2,000 2,000 2,000 2,000
打印第一和第三栏给了我最初的预期输出。
awk -F'\t|\t' '{print $1 "\t" $3}' nodes.dmp | less但我很想知道为什么这不像预期的那样有效。
我知道下面的perl一行程序会起作用,但我真正想要的是使用awk。
perl -aln -F"\t\|\t" -e 'print $F[0],"\t",$F[1]' nodes.dmp | less发布于 2013-08-13 06:29:50
管道|字符似乎混淆了awk,使其认为\t|\t意味着字段分隔符可能是\t或\t中的一个。告诉awk按字面解释|。
$ awk -F'\t[|]\t' '{print $1 "\t" $2}'
1 all
1 root
2 Bacteria
2 Monera
2 Procaryotae
2 Prokaryota
2 Prokaryotae
2 bacteria发布于 2013-08-13 11:56:41
根据你的投稿:
|结尾,而不是以|\t结尾|\t|的情况(前2行),以及因此,制表符选项卡的FS是错误的,因为它将不匹配上述任何一种情况,因为第一种情况只是选项卡-管道,而第二种选项卡将与前面字段中的选项卡-管道选项卡相匹配,但这只会使管道选项卡用于下面的字段,而第一种选项卡将给您留下一个不受欢迎的引导选项卡。
实际上,您需要的是将FS设置为仅为制表符管道,然后从每个字段中去掉前面的选项卡:
awk -F'\t|' -v OFS='\t' '{gsub(/(^|[|])\t/,""); print $1, $2}' file这样,您就可以处理从1到NF-1的所有字段,完全相同。
发布于 2013-08-13 12:04:23
使用cut命令:
cut -f1,2 -d'|' file.txt 在输出中没有pipe:
cut -f1,2 -d'|' file.txt | tr -d '|'https://stackoverflow.com/questions/18201923
复制相似问题