【问题标题】:Replace duplicate values of first column with character "用字符“替换第一列的重复值
【发布时间】:2020-02-18 18:41:16
【问题描述】:

示例输入:

a:g:h:e:f:n
a:u:r:t:w:r
a:g:r:o:p:q
d:h:t:y:r:o
d:n:t:s:d:f
d:g:h:u:i:m:
d:s:e:r:t:y
n:m:k:s:t:r
n:r:t:y:w:g

预期输出:

a:g:h:e:f:n
":u:r:t:w:r
":g:r:o:p:q
d:h:t:y:r:o
":n:t:s:d:f
":g:h:u:i:m:
":s:e:r:t:y
n:m:k:s:t:r
":r:t:y:w:g

用“替换第一列重复项,直到找到不同的值。这是我发现的接近的东西,但替换是跨文件的:

awk '{for(i=1;i<=NF;i++){if(x<27&&$i=="old"){x++;sub("old","new",$i)}}}1' input_file

【问题讨论】:

  • 请同时添加您尝试解决此问题的内容..
  • awk '{for(i=1;i 这是我发现接近的东西,但替换是跨文件
  • 输入是否总是按示例中所示的第一列排序?
  • @Sundeep 是的,仅限于第一列
  • " 作为替换值是一个奇怪的选择!

标签: unix awk solaris


【解决方案1】:

使用 awk:

$ awk 'BEGIN{FS=OFS=":"}{t=$1;if($1==p)$1="\"";p=t}1' file

输出:

a:g:h:e:f:n
":u:r:t:w:r
":g:r:o:p:q
d:h:t:y:r:o
":n:t:s:d:f
":g:h:u:i:m:
":s:e:r:t:y
n:m:k:s:t:r
":r:t:y:w:g

解释:

$ awk '
BEGIN {
    FS=OFS=":"     # field delimiters
}
{
    t=$1           # 1st field to tmp
    if($1==p)      # if current equals previous
        $1="\""    # replace with "
    p=t            # previous form tmp
}1' file           # output

更新:使用sub

$ awk 'BEGIN{FS=":"}{t=$1;if($1==p)sub(/^[^:]*/,"\"");p=t}1' file

【讨论】:

  • 我有 solaris 盒子,awk 下的 OFS 不起作用
  • 如果不行,是不是一定要用空格作为输出分隔符?
  • @JamesBrown,我明白了,先生,他在太阳上是我们需要使用 nawk 的地方,看起来我的代码对他有用。
  • @RavinderSingh13 是的,++。我仍然很惊讶为什么 OFS 不起作用。太糟糕了,我毁了我值得信赖的老 Sun 5。
【解决方案2】:

请您尝试关注(由于 OP 提到 os 是 Sun os 所以使用nawk)。

nawk -v var="\"" '
 BEGIN{
   FS=OFS=":"
   }
 {
   $1=++a[$1]>1?var:$1
 }
 1
' Input_file

由于您在 Sun os 上使用上述代码中的 nawk。此代码将不依赖于第一个字段的顺序而不管它的顺序,这应该有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多