使用粘贴的 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>
,如果更短则覆盖其中的一部分。
您可以使用 fromdos
、dos2unix
或 recode
等多种工具将文件转换为 UNIX 行结尾。在 awk 中即时执行此操作的一种方法是
awk '{ sub(/\r$/, ""); print "\t" "\t" "\t" }' file
样式说明:考虑使用 OFS
特殊变量,而不是对分隔符进行硬编码:
awk -v OFS='\t' '{ sub(/\r$/, ""); print , , , }' file
这使得命令更容易适应,以防您以后想要生成不同的分隔值。
这是我的文件:
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>
,如果更短则覆盖其中的一部分。
您可以使用 fromdos
、dos2unix
或 recode
等多种工具将文件转换为 UNIX 行结尾。在 awk 中即时执行此操作的一种方法是
awk '{ sub(/\r$/, ""); print "\t" "\t" "\t" }' file
样式说明:考虑使用 OFS
特殊变量,而不是对分隔符进行硬编码:
awk -v OFS='\t' '{ sub(/\r$/, ""); print , , , }' file
这使得命令更容易适应,以防您以后想要生成不同的分隔值。