file1.dat
包含以下内容的分隔文本文件。我想通过附加到该列中$COL
每个分隔的文本字符串来更改第三列。#
我想对每一行都这样做并以相同的名称保存文件。
有人可以帮忙吗?
输入样本
name|class|colors|age|email
abc|xyz|#orange#green#pink#blue|16|[email protected]
pqr|xyz|#orange#green#pink#blue|20|[email protected]
所需输出
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]
答案1
在您的示例中,您希望添加$COL
到以 开头的行中每个字符串的末尾#
。对于这个简单的情况,您可以简单地执行以下操作:
$ sed -E 's/(#[^#|]*)/\1$COL/g' file
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]
或者,如果您sed
不支持-E
:
sed 's/\(#[^#|]*\)/\1$COL/g' file
您可以使用-i
就地编辑文件:
sed -i -E 's/(#[^#|]*)/\1$COL/g' file
对于更一般的情况,要替换添加$COL
到#
分隔字符串但仅在第三个|
分隔字段上,您可以执行以下操作:
$ awk -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1' file
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]
使用较新版本的 GNU awk
,您可以使用-i inplace
就地编辑文件:
awk -iinplace -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1'
最后,为了好玩,您还可以使用 Perl 更改所有#
-defiend 字符串:
perl -pe 's/(#[^#|]+)/$1\$COL/g' file
或者,仅在第三列上执行此操作:
perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g; print join "|",@F' file
或者,仅在第三列上执行此操作并跳过第一行:
perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g if $.>1; print join "|",@F' file
在这两种情况下,您都可以就地-i
编辑文件。