- 此问题在此处已有答案**:
sed: replace values in a single column(3个答案)
1小时前关闭。
我有一个文件,其中的列由一个半列(;),而我只想将某个特定列中出现的某个单词更改为另一个单词。列号根据保存该列号的变量进行区分。要更改的单词存储在变量中,要更改为的单词也存储在变量中。
我试过了
sed -i "s/\<$word\>/$wordUpdate/g" $anyFile
我试过这个,但它改变了整个文件中单词的所有出现!我只想在特定的列
列数存储在一个名为numColumn的变量中,列之间用半列分隔;
3条答案
按热度按时间wrrgggsh1#
使用
awk
进行列编辑要简单得多,例如,如果您的输入如下所示:您可以将
c
列中的60
替换为s
,如下所示:输出:
uqjltbpv2#
这可能对您有用(GNU sed):
将每一行转换为单独的文件,其中列是行。
用单词替换匹配的行(列号)以替换更新的单词。
反向转换。
注意:该解决方案依赖于GNU only
e
评估标志。此外,word
和updateWord
可能需要引用。nom7f22z3#
这 * 可以 * 做一点创造力...
注意,我使用双引号来嵌入逻辑,这需要一点额外的注意,使你的
\
在反向引用时加倍。解释道:
lead="^([^;]*;){$((c-1))}"
^
表示 * 在记录的开头 *(...)
是指定重复的后续{...}
的分组[^;]*
表示 * 零个或多个非分号 *$((c-1))
进行计算并返回比所需列小一的值;如果要查看第3列,它返回2。^([^;]*;){$((c-1))}
位于记录的开头, 比列少一 * 出现的非分号后跟分号因此,
sed -E "/$lead$word;/{s/($lead)$word/\\1$new/}" file
意味着读取file
,并在所请求的列 * 中 * 出现$word
的记录上,保存它之前的所有内容,并将该内容放回原处,但是用$new
替换$word
。即使您必须使用
sed
,我也推荐一个函数。使用中-
如果没有匹配则不做更改-
注-
如果您想匹配最后一个字段,此逻辑需要尾随分隔符-
删除的分隔符:
否则你就得把逻辑弄复杂一点。
但老实说,对于字段解析,使用
awk
,甚至perl
或python
,或者bash
循环会更好,尽管这会相对较慢。