【问题标题】:awk insert columns and printing on single lineawk 插入列并在单行上打印
【发布时间】:2021-10-15 10:11:15
【问题描述】:

我正在尝试使用 AWK 处理逗号分隔的文本文件并插入新列。 我想将第二列的内容分成三部分并插入三列 在新文本文件中的 B 列之后。

插入.txt - 我的数据

column A, name|ID1234 @ tag1, column C, column D

我正在尝试产生的输出

column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D

我尝试过的代码

#!/bin/awk

BEGIN {
   FS=","
  OFS=","
}
{
#  Split Column B - twice
   split($2,a,"|")   #a[1] a[2] seperated by |
   split(a[2],b,"@") #b[1] b[2] seperated by @    

   print $1,$2,a[1],b[1],b[2]; 
   {for(i=3;i<=NF;++i) printf $i}
}

awk -f insert.awk insert.txt &gt; output.txt

如何将输出格式化为全部在一行上,用插入的列用逗号分隔?

是否可以在输出过程中修剪每列开头和结尾的空白?

谢谢 约书亚

【问题讨论】:

    标签: awk


    【解决方案1】:

    您可以在awk 的任何版本中使用此解决方案:

    awk 'BEGIN {FS=OFS=", "}
    {v2 = $2; gsub(/ *[|@] */, OFS, v2); $2 = $2 OFS v2} 1' file
    
    column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
    

    我们使用字段分隔符", " 拆分每条记录,然后将$2 的存储值中的|@ 替换为相同的字段分隔符@ 变量v2。然后我们将 v2 的更改后的值附加到 $2OFS 之后,最后打印完整记录。

    【讨论】:

      【解决方案2】:

      使用您显示的示例,请尝试遵循awk 代码。使用 GNU awk 编写和测试。

      awk '
      match($0,/^[^,]*,[^,]*,/){
        val1=$3
        sub(/\|/,", ",val1)
        val2=val3=substr($0,RSTART,RLENGTH)
        sub(/.*@ /,"",val3)
        print val2,  val1 ", " val3 substr($0,RSTART+RLENGTH)
      }
      '  Input_file
      

      【讨论】:

        【解决方案3】:

        awk 的另一种可能性是

        awk 'BEGIN {FS=OFS=", "}{split($2,a,/[ |]/);print $1, $2, a[1], a[2], a[4], $3, $4}' file
        column A, name|ID1234 @ tag1, name, ID1234, tag1, column C, column D
        

        使用split(),我们将$2 字段name|ID1234 @ tag1 拆分为保存在a 数组中的片段。然后我们在$2$3字段之间打印三个a[1]a[2]a[4]

        split() 的分隔符可以是正则表达式,而不仅仅是单个字符:/[ |]/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-13
          • 1970-01-01
          相关资源
          最近更新 更多