如何删除许多相似文本行上两列之间的制表符?

如何删除许多相似文本行上两列之间的制表符?

我有一个正在格式化的文档,它包含 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仅向后引用匹配的字母字符,并且在替换部分中,我们仅删除字母和\tab。

答案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 被删除。

相关内容