【问题标题】:Unix - Split line after 9th commaUnix - 第 9 个逗号后的分割行
【发布时间】:2011-10-06 05:16:42
【问题描述】:

我编写了一个 ksh shell 脚本,并且我有很长的逗号分隔字符串,我只需要在第 9 个逗号之后将其分成单独的行。在第 9 个逗号之后,我想删除那个逗号并换行:

例如: 初始字符串 1,2,3,4,5,6,7,8,9,10,11,12,13,14,14,15,16,17,18,19,20,21

输出:

1,2,3,4,5,6,7,8,9,10
11,12,13,14,14,15,16,17,18,19,20
21

我知道这可以通过 awk 实现,但我对命令不太熟悉。有人可以提供如何做到这一点

谢谢

【问题讨论】:

  • man awk ? ..你熟悉那个命令吗? :)

标签: unix shell awk ksh


【解决方案1】:
awk -F, '{
    for (i=1; i<=NF; i++) {
        printf("%s", $i);
        if (i % 10 == 0 || i == NF)
            printf "\n";
        else
            printf ",";
    }
}' textfile

解释:NF 是字段数。 $i 是i'th 字段; $ 是 Awk 中的运算符,而不是 sigil。

【讨论】:

  • 我还是不明白。我想我永远不会;有点冗长,不是吗? Edit 同样,在 my long input sample (under Bonus) 上运行它会导致第三行包含 13 个元素。有什么问题吗?
  • ...哦...最后一行有一个逗号
  • @sehe:修正了尾随的逗号。
【解决方案2】:
cat t.txt | xargs -d, -rn10 | sed 's/ /,/g'

注意:为了清楚起见,cat 的使用是无用的:这可以是任何进程

根据您的实际需要,删除sed 步骤并获得分隔的输出空间

奖励积分:

输入(t.txt)

1,2,3,4,5,6,7,8,9,10,11,12,13,14,14,15,16,17,18,19,20,21
22,23
24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50

输出

1,2,3,4,5,6,7,8,9,10
11,12,13,14,14,15,16,17,18,19
20,21
22,23
24,25,26,27,28,29,30,31
32,33,34,35,36,37,38,39,40,41
42,43,44,45,46,47,48,49,50

如果您想要均匀的行填充,请添加粘贴:

paste -sd, t.txt| xargs -d, -n10 | sed 's/ /,/g'

1,2,3,4,5,6,7,8,9,10
11,12,13,14,14,15,16,17,18,19
20,21,22,23,24,25,26,27,28,29
30,31,32,33,34,35,36,37,38,39
40,41,42,43,44,45,46,47,48,49
50

【讨论】:

  • $ cat t.txt | xargs -d, -rn10 | sed 's/ /,/g' xargs: 非法选项 --d xargs: 用法: xargs: [-t] [-p] [-e[eofstr]] [-E eofstr] [-I replstr] [-i [replstr]] [-L #] [-l[#]] [-n # [-x]] [-s size] [cmd [args ...]]
  • 嗯,你没有 GNU xargs;您可以尝试gxargs 或了解 GNU xargs 是否在 /opt/ 或类似下可用(通常至少在 Solaris 上)。我知道某些 BSD 具有“可切换”用户区,因此找到的 xargs 版本取决于您的环境。 AIX has packages for GNU coreutils here
【解决方案3】:
$ s='1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21'

$ print "$s" | tr , '\n' | paste -d , - - - - - - - - - - | sed -e 's/,\+$//'
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
21

$ print "$s" | tr , '\n' | xargs -n 10 echo | tr " " ,
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多