【问题标题】:Column processing in UnixUnix 中的列处理
【发布时间】:2020-11-05 03:29:38
【问题描述】:

我的输入文件有

col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],

我想用逗号分割 col4 中的值,并将前 3 个值放在 col5、col6、col7 中,从第 4 个值开始忽略。

预期输出:

col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c

请帮忙。

我使用过以下命令:

echo "col1\tcol2\tcol3\tcol4\tcol5\tcol6\tcol7" >> cipoc_output.csv
awk -F"," '$1=$1' OFS="\t" cipoc_input.csv >> cipoc_output.csv
cat cipoc_output.csv

【问题讨论】:

  • 我尝试使用 awk、sed 和 cut 命令。但无法准确得到它
  • @anubhava 添加
  • 您添加的代码与您描述的问题毫无关系 - 它所做的只是打印标题并将逗号更改为制表符。

标签: regex shell unix awk


【解决方案1】:

您可以将此gnu awkFPAT 一起使用:

awk -v FPAT='\\[[^]]*]|[^,]+' 'NR > 1 {
   s=$4
   gsub(/^\[|,[^,]+\]$/, "", s)
   $0 = $0 s
} 1' file
col1, col2, col3, col4, col5, col6, col7
111,0.1, 0.5,[a,b,c,d],a,b,c

【讨论】:

    【解决方案2】:
    $ awk 'BEGIN{FS=OFS=","} NR==1{print; next} {o=$0; gsub(/[][]/,""); print o $4, $5, $6}' file
    col1, col2, col3, col4, col5, col6, col7
    111,0.1, 0.5,[a,b,c,d],a,b,c
    

    如果这还不是您所需要的,那么请编辑您的问题,以提供更多真正具有代表性的示例输入/输出,而这些示例输入/输出并不适用。

    【讨论】:

      【解决方案3】:

      您能否尝试使用https://ideone.com/o0slbt中显示的示例进行跟踪、编写和测试

      awk '
      FNR==1{ print; next }
      match($0,/\[[^]]*/){
        val=substr($0,RSTART,RLENGTH)
        start=RSTART
        end=RSTART+RLENGTH
        match(val,/.*,/)
        print substr($0,1,start) substr(val,RSTART+1,RLENGTH) substr($0,end) substr(val,RSTART+1,RLENGTH-2)
        val=start=end=""
        next
      }
      1
      ' Input_file
      

      【讨论】:

        【解决方案4】:

        这是一个sed 的解决方案,假设周围没有任何极端字符。

        > sed -e 's/\[\([^][]*\),[^,]*\],/&\1/g' file
        col1, col2, col3, col4, col5, col6, col7
        111,0.1, 0.5,[a,b,c,d],a,b,c
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 2016-03-31
          相关资源
          最近更新 更多