特定字段的 unix txt 文件格式

特定字段的 unix txt 文件格式

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编辑文件。

相关内容