【问题标题】:Cut part of path in CSV without deleting rest of csv file在 CSV 中剪切部分路径而不删除 csv 文件的其余部分
【发布时间】:2022-05-25 17:23:19
【问题描述】:

我有看起来像这样的 CSV 文件:

/users/my/temporaryprojects/project1/Assets/file.ttf,Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
/users/my/temporaryprojects/project2/Assets/file2.ttf,Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype

我需要将路径更改为 users/my/temporaryprojects/project1 + CSV 数据的其余部分、users/my/temporaryprojects/project2 + CSV 数据的其余部分等...。我试图做不同的bash脚本,比如

cut -d\'/\' -f 5- newTTF-Projects-INFO.csv >> ONETTF-Projects-INFO.csv

但不幸的是,每次脚本删除第一个逗号分隔值之后的所有内容时:

/users/my/temporaryprojects/project1
/users/my/temporaryprojects/project2

我需要它采用这种格式:

/users/my/temporaryprojects/project1, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
/users/my/temporaryprojects/project2, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype

我需要缩短文件的路径,首先是文件的路径,并保留所有其他数据。我知道每次我只需要价值的前 4 部分。我试图用 \"cut\"、\"sed\"、\"awk\" 整夜这样做,但我没有我的结果。每个方法都会删除第一个逗号后的值。有人可以帮我吗?我没有找到我的问题的任何答案。要编辑的文件有很多行,例如示例中的行。

  • 一个简单的sed \'s#^[^,]*/#my/new/path/#\' newTTF-Projects-INFO.csv 就足够了
  • @Fravadona 我稍微改变了我的问题,抱歉我的解释错误。我需要具有与 CSV 中的路径完全相同的确切路径,并且文件中也有不同的路径。我只需要路径的前 4 个部分和 CSV 数据的其余部分。但我很欣赏你的回答,它实际上是最接近我的问题的一个:)
  • 是否有可能引用第一个字段?例如,如果路径之一包含逗号,就会出现这种情况。
  • 不,它没有被引用

标签: bash csv directory path


【解决方案1】:

使用sed

$ sed s'~\(\(/[^/]*\)\{4\}\)[^,]*,~\1, ~' input_file
/users/my/temporaryprojects/project1, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
/users/my/temporaryprojects/project2, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype

【讨论】:

    【解决方案2】:
    • backreferences-有能力regex 这个准系统根本不需要引擎 awk-solution

    • 直接清洁FSOFS

    代码

    echo "${input}" | 
    
    mawk NF=NF FS='[/][^,\\/]*[/][^,\\/]*[,]' OFS=', '
    
               or simply just
    
    gawk NF=NF FS='[/][^,/]*[/][^,/]*[,]' OFS=', '
    

    输出

    /users/my/temporaryprojects/project1, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
    /users/my/temporaryprojects/project2, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
    

    【讨论】:

      【解决方案3】:
      awk -F, -v level="2" '
        function dirname(f,l) {
          s = ""; n=split(f,a,"/");
          for (i=2; i<=n-l; i++) {  s = s "/" a[i] }
          return s
        }
        function basename(f) {
          n=split(f,a,"/");return a[n]
        }
        BEGIN{ OFS=FS }
        {$1=dirname($1,level); $2=" "$2}1
      ' input_file
      
      /users/my/temporaryprojects/project1, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
      /users/my/temporaryprojects/project2, Arial Unicode MS,Regular,Arial Unicode MS,ArialUnicodeMS,Version 1.01x,Monotype
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 2012-07-22
        相关资源
        最近更新 更多