使用粘贴的 GUI 故障?

GUI glitch using paste?

这是我的文件:

file.txt

cg13869341      1       15865
cg24669183      1       534242
cg15560884      1       710097
cg01014490      1       714177
cg17505339      1       720865
cg11954957      1       758829
cg23803172      1       763119
cg16736630      1       779995
cg00168193      1       790667
cg05898754      1       805102

awk '{print "\t" "\t" "\t" }' file.txt

产出

 1       cg13869341
 1       cg24669183
 1       cg15560884
 1       cg01014490
 1       cg17505339
 1       cg11954957
 1       cg23803172
 1       cg16736630
 1       cg00168193
 1       cg05898754

awk '{print "\t" "\t" "\t" }' file.txt | head -1 | tr '\t' '\n'

产出

 1
 15865
 15865
 cg13869341

好的,格式本身是正确的,但输出很奇怪。所以我尝试别的东西。

awk '{print }' file.txt > 1.txt awk '{print }' file.txt > 2.txt awk '{print }' file.txt > 3.txt

paste 2.txt 3.txt 3.txt 1.txt | head

 1       cg13869341
 1       cg24669183
 1       cg15560884
 1       cg01014490
 1       cg17505339
 1       cg11954957
 1       cg23803172
 1       cg16736630
 1       cg00168193
 1       cg05898754

粘贴2.txt3.txt给出了预期的输出(切到头-2):

 1       15865
 1       534242

与 3.txt 和 1.txt 一样:

 15865   cg13869341
 534242  cg24669183

那为什么我粘贴2.txt3.txt3.txt1.txt的时候,中间两列就消失了?

我是不是遗漏了什么?

我可以使用具有 Windows 行结尾(\r\n 而不是 \n)的文件重现该行为。在这种情况下,最后一个字段将不是 "15865" 而是 "15865\r",因此每次打印 </code> 时,光标都会移动到下一个选项卡和字段之前的行首打印。下一个字段将覆盖刚刚写入的 <code>,如果更短则覆盖其中的一部分。

您可以使用 fromdosdos2unixrecode 等多种工具将文件转换为 UNIX 行结尾。在 awk 中即时执行此操作的一种方法是

awk '{ sub(/\r$/, ""); print  "\t"  "\t"  "\t"  }' file

样式说明:考虑使用 OFS 特殊变量,而不是对分隔符进行硬编码:

awk -v OFS='\t' '{ sub(/\r$/, ""); print , , ,  }' file

这使得命令更容易适应,以防您以后想要生成不同的分隔值。