【问题标题】:Remove '||'(double pipe) separated multiple columns from file using shell script command使用 shell 脚本命令从文件中删除“||”(双管道)分隔的多个列
【发布时间】:2021-07-31 22:18:04
【问题描述】:

请建议完美的shell脚本命令来删除最后两个'||'分隔符从文件中分隔列。(假设下面的示例) 文件名:abc.dat

"a1"||"a2"||"a3"||"a4"
"b1"||"b2"||"b3"||"b4"
"c1"||"c2"||"c3"||"c4"

输出应该是这样的:

"a1"||"a2"
"b1"||"b2"
"c1"||"c2"

我尝试了以下 cut 和 awk 命令但没有成功:

awk -F '||' '{print $1$2}'  ${file} >> ${file}
cut -d'||' -f2 --complement ${file} >> ${file} (not working as cut: the delimiter must be a single character)

【问题讨论】:

    标签: awk grep cut


    【解决方案1】:

    使用您展示的示例,请尝试以下操作。将字段分隔符设为||(将其转义以处理文字字符),同时将OFS 设置为||。然后为 Input_file 的每一行打印第一个和第二个字段。

    awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file
    

    一旦您对上述命令的结果感到满意,也可以对 Input_file 本身进行更改,尝试以下操作。

    awk -F'\\|\\|' -v OFS="||" '{print $1,$2}' Input_file > temp && mv temp Input_file
    


    第二个解决方案:使用 GNU grep 尝试以下操作。

    grep -oP '^.*?\|\|"[^"]*' Input_file
    

    【讨论】:

    • 感谢@RavinderSingh13 的回复,您的解决方案运行良好,只有一件事,我得到了额外的'||'最后使用第一种解决方案。
    • @R_Kalavadiya,通过您展示的示例,这些解决方案对我来说效果很好。
    • 鉴于您显示的输入和答案中的脚本,@R_Kalavadiya that 是不可能的。
    【解决方案2】:

    与其假设|| 是分隔符,不如假设| 是分隔符并且第二个字段为空。

    $ cut -d'|' -f1-3 <<EOF
    > "a1"||"a2"||"a3"||"a4"
    > "b1"||"b2"||"b3"||"b4"
    > "c1"||"c2"||"c3"||"c4"
    > EOF
    "a1"||"a2"
    "b1"||"b2"
    "c1"||"c2"
    

    (假设选择 || 是出于某种审美原因,而不是允许在每个字段中使用单个管道。)

    【讨论】:

    • 如果||s 之间有| 字符,那么它可能不起作用
    • @anubhava 是的,我在最后一句话中承认这一点。
    【解决方案3】:

    你可以使用:

    awk '{sub(/(\|{2}[^|]*){2}$/, "")} 1' file
    
    "a1"||"a2"
    "b1"||"b2"
    "c1"||"c2"
    

    或者,如果您只想删除最后 2 列而不关心总共使用了多少列:

    awk -F '\\|{2}' -v OFS='||' '{
       $NF = $(NF-1) = ""
       sub(/([|]{2})*$/, "")
    } 1' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-08-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多