【问题标题】:use cut inside awk to extract substring of a field在 awk 中使用 cut 来提取字段的子字符串
【发布时间】:2016-02-07 09:21:25
【问题描述】:

1) 我有一个如下所示的 Source_File.csv

A;B;/Path/xx/file1_name
C;D;/anotherPath/yyyyy/file2_name

2) 我想生成一个 Target_File.csv

A;B;/Path/xx/;/Path/xx/file1_name
C;D;/anotherPath/yyyyy/;/anotherPath/yyyyy/file2_name

命令

cat Source_File.csv | awk -F";" '{print $1";"$2";"echo $3 |
cut -d'/' -f1,2,3";"$3}' >> Target_File.csv;

给出这个错误

awk: {print $1";"$2";"echo $3 | cut -d/ -f1,2,3";"$3}
awk:                                       ^ syntax error

提前感谢您的建议/建议

【问题讨论】:

    标签: bash awk cut


    【解决方案1】:

    无需使用catcut 等,仅awk 就足够了:

    awk 'BEGIN{FS=OFS=";"} {s=$NF; sub(/[^\/]+$/, "", s); print $1,$2,s,$NF}' Source_File.csv
    A;B;/Path/xx/;/Path/xx/file1_name
    C;D;/anotherPath/yyyyy/;/anotherPath/yyyyy/file2_name
    

    【讨论】:

    【解决方案2】:

    使用 sed:

    sed 's|/.*/|&;&|' file
    

    输出:

    A;B;/路径/xx/;/路径/xx/file1_name C;D;/anotherPath/yyyyy/;/anotherPath/yyyyy/file2_name

    如果您想“就地”编辑文件,请使用 sed 的选项 -i

    【讨论】:

      【解决方案3】:

      您要做的是将目录名和完整文件名提取为两个单独的组件。

      您可以在 awk 中使用 split() 和数组轻松地做到这一点 -

      猫 /tmp/t.csv | awk -F";" '{ n=split($3, a, "/"); s1="";我=1; 当我

      A;B;//路径/xx;/路径/xx/file1_name C;D;//anotherPath/yyyyy;/anotherPath/yyyyy/file2_name

      更简单的方法是使用 bash 并执行 猫/tmp/t.csv | sed -e 's/;/ /g' |在阅读 a b c 时;做 echo "$a;$b;dirname $c;$c" ;完成

      【讨论】:

      • 这基本上等同于 Anubhava 的答案,只是它保留了useless use of cat。建议使用 shell 循环似乎是错误的。
      猜你喜欢
      • 2014-05-12
      • 2015-05-10
      • 2013-04-09
      • 2013-03-01
      • 2014-10-20
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多