如何使用Awk创建新字段但保留原始字段?

如何使用Awk创建新字段但保留原始字段?,awk,sed,Awk,Sed,这可以在Awk中完成吗 文件(输入文件) 文件输出(所需结果) 应用逻辑: IF Title contains “ Cat Sat ” OR " cat sat " THEN Nickname = “Cat Sat” #same titlecase/text as was found# IF Title contains “ Dog ” OR " dog " THEN Nickname = “Dog” 另外,使用Sed是否可以执行此任务?您可以使用GNUawk尝试此操作: awk -F"|"

这可以在Awk中完成吗

文件(输入文件)

文件输出(所需结果)

应用逻辑:

IF Title contains “ Cat Sat ” OR " cat sat " THEN Nickname = “Cat Sat” #same titlecase/text as was found#
IF Title contains “ Dog ” OR " dog " THEN Nickname = “Dog”

另外,使用Sed是否可以执行此任务?

您可以使用GNU
awk
尝试此操作:

awk -F"|" -v OFS="|" 'NR==1{$2 = $2 OFS "Nickname"} 
NR>1{if($0 ~ /\s*[Cc]at [Ss]at\s+/) n="Cat"; else if($0 ~ /\s*[dD]og\s+/)n="Dog";
else n=""; $2 = $2 OFS n}  1' file
  • -F“|”OFS=“|”
    分别指定分隔符输入和输出
  • NR==1
    来处理标题情况
  • NR>1
    处理数据案例
使用相同的逻辑,您可以使用更紧凑的代码:

awk -F"|" -v OFS="|" 'NR==1{$2 = $2 OFS "Nickname"} 
NR>1{n=($0 ~ /\s*[Cc]at [Ss]at\s+/) ? "Cat" : ($0 ~ /\s*[dD]og\s+/) ? "Dog" : ""; $2 = $2 OFS n}  1' file
这可能适用于您(GNU-sed):


在标题中插入列
昵称
。如果第二列包含单词
Cat
Dog
,请插入第三列,其中包含匹配的单词。否则,插入空白的第三列。

另一列
awk

$ awk 'BEGIN{FS=OFS="|"} 
            {delete a; 
             match($2,"([Cc]at [Ss]at|[Dd]og)",a); 
             $NF=(NR==1?"Nickname":a[1]) OFS $NF}1' file

ID_Number|Title|Nickname|Name
65765765|The Cat Sat on the Mat|Cat Sat|Dennis Smith
65765799|The Dog Sat on the Catshelf|Dog|David Jones
65765797|The Horse Sat on the Sofa||Jeff Jones

大小写是否重要?如果标题中出现了
cat
,那么输出中的昵称应该是
cat
还是
cat
还是什么都没有?部分匹配的情况如何,例如,如果标题是“我的双体船沉没了”,那么它包含了“猫”,那么是否应该添加昵称“猫”?位置重要吗?在您的示例中,关键字总是出现在标题的第二个单词处,这总是正确的吗?我的朋友是一只真正的猎犬怎么样?考虑边缘案例,并将其包括在示例输入/输出中,而不仅仅是晴天案例。使用sed:可能,但强烈劝阻。埃德:我编辑了这个问题。
65765765 |猫坐在狗床上|丹尼斯·史密斯
?我觉得这个问题的要求比你告诉我们的要多,所以我不愿意插嘴并开始猜测……埃德:如果发现“第一个匹配”用于设置昵称,例如Cat Sat。然后忽略任何其他匹配,例如Dog。似乎适用于“Dog”,但不确定“Cat Sat”的语法是否正确.我认为数组参数是
gawk
特定的。如果您使用的是不同的实现,您应该使用
RSTART
RLENGTH
从字段中获取匹配的字符串。我在Mac OS X上使用的是GNU Awk 4.2.1(2018)。Match命令应该在那里工作吗?我认为应该,不确定问题可能是什么。也许发布错误消息?
awk -F"|" -v OFS="|" 'NR==1{$2 = $2 OFS "Nickname"} 
NR>1{n=($0 ~ /\s*[Cc]at [Ss]at\s+/) ? "Cat" : ($0 ~ /\s*[dD]og\s+/) ? "Dog" : ""; $2 = $2 OFS n}  1' file
sed -i '1s/|/&Nickname&/2;1b;s/|.*\b\(Cat\|Dog\)\b.*|/&\u\1|/I;t;s/|.*|/&|/' file
$ awk 'BEGIN{FS=OFS="|"} 
            {delete a; 
             match($2,"([Cc]at [Ss]at|[Dd]og)",a); 
             $NF=(NR==1?"Nickname":a[1]) OFS $NF}1' file

ID_Number|Title|Nickname|Name
65765765|The Cat Sat on the Mat|Cat Sat|Dennis Smith
65765799|The Dog Sat on the Catshelf|Dog|David Jones
65765797|The Horse Sat on the Sofa||Jeff Jones