我想使用sed
带有通配符表达式的命令在 TSV 文件中插入字符:
我有一个这样的文件:
Marker Pvalue Trait Chr Pos
S3_16887238 6.172847e-09 Total_Soil_S 3 16887238
S3_16887238 6.172847e-09 Total_Soil_Pa 3 16887238
S3_16887238 6.172847e-09 Total_Soil_Cl 3 16887238
我想_All
在第三列的所有文本末尾添加如下内容:
Marker Pvalue Trait Chr Pos
S3_16887238 6.172847e-09 Total_Soil_S_All 3 16887238
S3_16887238 6.172847e-09 Total_Soil_Pa_All 3 16887238
S3_16887238 6.172847e-09 Total_Soil_Cl_All 3 16887238
我正在使用此命令但它不起作用:
sed -i 's/Total_Soil_\(.*\)/&_\1_All/g' top1.txt
这只是一个示例文件,除了S
, Pa
, 和Cl
.
我会避免处理表格数据,
sed
因为很难正确定位要修改的数据中的确切位置。该sed
实用程序更适合处理文本等非结构化数据。使用Miller(
mlr
一种专门用于处理结构化数据的工具)将字符串附加到每个 TSV 记录字段_All
中数据的末尾:Trait
mlr
与其选项一起使用-I
以就地进行更改。您是否需要确保仅当字段以字符串开头时才修改该字段
Total_Soil
,然后使用使用
awk
,将字符串附加_All
到每条记录的第三个制表符分隔字段中的数据末尾:1
代码末尾的尾随awk
导致无条件输出修改后的记录。在某种程度上,它是一种速记方式{ print }
。请注意,我们明确需要避免修改标头。我们通过仅在测试计算结果为真(是当前记录的序号)时测试使用NR > 1
和修改字段来执行此操作。NR
将输出重定向到新文件,然后将新文件重命名为原始名称。或者,如果您使用的是 GNU
awk
,请-i inplace
按照另一个问题+答案中的说明使用。同样,如果您需要确保只修改以 string 开头的第 3 个字段
Total_Soil
,则使用以几乎相同的方式使用 Perl
awk
:确保我们只修改
Total_Soil
数据:使用Raku(以前称为 Perl_6)
Raku 是 Perl 编程语言家族的一员。Raku 的一个优势是对内置 Unicode 的高级支持,不需要外部库(或特殊标志)。
以上是@Kusalananda 出色的 Perl(5) 答案的相当直接的翻译。
-ne
使用Raku 的非自动打印“linewise”命令行标志。要逐字打印标题行,请使用将(print-using-terminator) 放在第一行的BEGIN
移相器。put get
get
linewise 命令的主体是这样工作的:声明一个数组并为其分配标签上的
my @a
输入行[是 ] 的缩写。$_
.split("\t")
.split("\t")
$_.split("\t")
取
@a.[2]
第三个元素(即列)并用相同的元素覆盖它,并@a.[2] ~ "_All"
用尾随_All
字符串连接波浪号。然后取出所有
@a
元素,join
在选项卡上重新组合在一起,然后 output
。示例输入:
示例输出:
https://docs.raku.org
https://raku.org
使用 sed 你可以:
要内联,添加一个
-i
after sed编辑:替换
[^ ]
为[^[:blank:]]
以匹配除Spaces和Tabs之外的所有内容。