我有一个正在格式化的文档,它包含 1/2 百万行文本,与下面的示例基本相同。我需要删除两个字母之间的选项卡,这样:
rs207460002 26 15579 T A
rs207459997 26 15615 G C
rs527236190 26 15637 T C
就变成这样了:
rs207460002 26 15579 TA
rs207459997 26 15615 GC
rs527236190 26 15637 TC
任何解决方案将不胜感激!
注意:这些是 5 个 TAB 列。
答案1
其他awk
方式:
awk '{cpy=$NF; NF--; print $0 cpy }' OFS='\t' infile
这会将最后一个字段的副本复制$NF
到名为 的变量中cpy
,并NF--
从当前输入行中删除最后一个字段$0
;接下来我们打印后面$0
跟着的行cpy
。指定OFS='\t'
了氧输出F产量S分离器。
或者sed
:
sed 's/\t\([A-Z]\)$/\1/' infile
这捕获了 ab 上的匹配组\t
,后跟每行末尾的单个字母字符,\1
仅向后引用匹配的字母字符,并且在替换部分中,我们仅删除字母和\t
ab。
答案2
$ awk '{ print $1 "\t" $2 "\t" $3 "\t" $4 $5 }' input.txt
rs207460002 26 15579 TA
rs207459997 26 15615 GC
rs527236190 26 15637 TC
答案3
回答
sed -ri "s/([A-Z])\t([A-Z])$/\1\2/" your_file
解释
-r
- 使用正则表达式扩展。 (允许使用正则表达式中的某些字符而不使用空格序列)
-i
- 将更改保留在文件中,不要将其写入stdout
.
s/([A-Z])\t([A-Z])$/\1\2/
-[capital_letter][TAB_key][capital_letter]
在行尾匹配并将其替换为匹配的[capital_letter][capital_letter]
。
your_file
- 您想要处理的文件sed
。
答案4
使用该sed
工具,这很简单:
sed -e 's/\t//4' input_file
解释:
\t
是角色的表示TAB
。对于 GNU sed 来说这是可以的,OTW 使用文字 TAB。s/\t//4
这意味着删除当前行中第四次出现的 TAB 字符。
我们Perl
可以使用lookarounds:
perl -pe 's/\t(?!.*\t)//' input_file
解释:
-p
使 Perl 逐行读取+自动打印行。s/\t(?!.*\t)//
regex 指示 Perl 查找在其右侧看不到另一个 TAB 的 TAB 字符,这意味着它是最后一个 TAB。然后该 TAB 被删除。