【问题标题】:Separating delimited file with awk用 awk 分隔分隔文件
【发布时间】:2014-08-04 23:55:37
【问题描述】:

我有一个名为 test.csv 的文件,其中包含以下列表:

3732476,83440122!87368863!83440122!84947700!85873717!84671134!26592084
3732477,84213509!86563958!87368863!83440122!84947700!85873717!84671134!26592084
3732478,86774401!87852418!86774401!86774401!86774425!84022200!83908575!70993638
3732479,86774401!86774425!86774401!86774401!86774425!84022200!83908575!70993638
3732480,86774401!86774425!87726670!86774401!86774425!84022200!83908575!70993638
3732481,86301748!86301748!86769792!86434407!27580741!86730857!27953536!83913569
3732482,27500429!83445205!27500429!27500702!83445205!88324688!27500958
3732483,27500429!83445205!27500429!27500702!83445205!88324688!27500958
3732484,87920354!89442350!87920354!89442290!27632964!27633136!86450151
3732485,84406968!86504550!86348235!87708562!86279816!84406968!88066692

块由一个 ID 和一系列数字组成。 ID 和数字之间的分隔符是逗号 (,),而这一系列数字有一个感叹号 (!) 的分隔符。系列的数量各不相同。

我需要显示:ID,Series,Number of series 像这样

对于第 3732485,84406968!86504550!86348235!87708562!86279816!84406968!88066692 行 我会得到:

3732485,84406968,1
3732485,86504550,2
3732485,86348235,3
3732485,87708562,4
3732485,86279816,5
3732485,84406968,6
3732485,88066692,7

我想我可以通过 AWK 做到这一点,但我没有那么敏捷。我可以用 NR 获得序列号。我可以使用字段分隔符 FS 分隔字段,但我无法让它在系列值旁边打印 $1 字段,然后是系列序列号。

有人想给我指出正确的方向吗?

谢谢!

【问题讨论】:

    标签: awk


    【解决方案1】:

    使用awk:

    awk -F[,\!] -v OFS="," '{for(i=2;i<=NF;i++) print $1,$i,(i-1)}' file
    3732476,83440122,1
    3732476,87368863,2
    ...
    ...
    3732485,84406968,6
    3732485,88066692,7
    
    • 将输入字段分隔符设置为,!。您需要转义!
    • 将输出字段分隔符设置为,
    • 从第二列迭代到最后一列并打印第一列、剩余列和计数。您根据输出中的需要从计数中减去 1。

    注意:我没有打印完整的输出,但你得到了图片。

    【讨论】:

    • 优秀的答案,+1(我告诉过你我会让你知道的...... :-))。
    • @EdMorton 告诉我,我忘记了。教我,我记得。让我参与,我学习! :)
    • 谢谢@jaypal,你是个天才。我不明白如何在 awk 中获取 for 循环以及打印的参数.....,太棒了!谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    相关资源
    最近更新 更多