【问题标题】:Remove new line only if after a number只有在数字之后才删除新行
【发布时间】:2017-03-18 08:30:39
【问题描述】:

我从终端收集了一些 CSV 数据,但每行只有 80 个字符长,因此无法正确导入。

这里有两行数据:

28,26166,25180,23645,22824,21257,20080,18921,17893,16702,15650,14647,13667,12691
,11971,11179,10393,9885,9294,8930,8390,8079,7660,7341,6907,6425,6120,5789,5588,5
267,4924,4581,4246,4025,3857,

3423,3567,3636,3633,3714,3844,4543,5887,7287,8499,9
746,10704,11658,12591,13379,13950,14679,14954,14756,14224,13921,13494,12849,1230
0,11970,12240,12867,13475,14310,15962,17624,19105,21075,

我想删除换行符如果它在任何数字或逗号之后,但不是如果它只是它自己,因为这意味着它是一个新的 CSV 数据行。

我不知道如何使用 sed 在 shell 上执行此操作。如果像 awkperl 这样的其他程序更适合这种情况,请随时向我展示解决方案。

预期输出:

28,26166,25180,23645,22824,21257,20080,18921,17893,16702,15650,14647,13667,12691,11971,11179,10393,9885,9294,8930,8390,8079,7660,7341,6907,6425,6120,5789,5588,5267,4924,4581,4246,4025,3857,

3423,3567,3636,3633,3714,3844,4543,5887,7287,8499,9746,10704,11658,12591,13379,13950,14679,14954,14756,14224,13921,13494,12849,12300,11970,12240,12867,13475,14310,15962,17624,19105,21075,

【问题讨论】:

  • 您真的在每个输入行之间都有一个空行并希望在输出中重复吗?

标签: regex perl shell awk sed


【解决方案1】:
perl -0pe 's/([\d,])\n([\d,])/$1$2/sg' (file)

应该这样做。

也就是说,读取不带行分隔符的文件,将整个内容视为一个字符串,并删除数字或逗号前后的换行符。

【讨论】:

  • 对不起,我也删除了数字和逗号。
【解决方案2】:

使用awk,以段落模式阅读并替换所有\n

$ awk -v RS= '{gsub("\n","")} 1' ip.txt 
28,26166,25180,23645,22824,21257,20080,18921,17893,16702,15650,14647,13667,12691,11971,11179,10393,9885,9294,8930,8390,8079,7660,7341,6907,6425,6120,5789,5588,5267,4924,4581,4246,4025,3857,
3423,3567,3636,3633,3714,3844,4543,5887,7287,8499,9746,10704,11658,12591,13379,13950,14679,14954,14756,14224,13921,13494,12849,12300,11970,12240,12867,13475,14310,15962,17624,19105,21075,


要保留空白,请将ORS 设置为双换行符,但这会在末尾添加一个额外的换行符

$ awk -v RS= -v ORS='\n\n' '{gsub("\n","")} 1' ip.txt 28,26166,25180,23645,22824,21257,20080,18921,17893,16702,15650,14647,13667,12691,11971,11179,10393,9885,9294,8930,0390,80797,6,7,6 6425,6120,5789,5588,5267,4924,4581,4246,4025,3857, 3423,3567,3636,3633,3714,3844,4543,5887,7287,8499,9746,10704,11658,12591,13379,13950,14679,14954,14756,14224,13921,130494,19784, 12240,12867,13475,14310,15962,17624,19105,21075,

【讨论】:

    【解决方案3】:

    你可以使用这个正则表达式:

    (?<!\n)\n(?!\n)
    

    并用空字符串替换。

    【讨论】:

    • 这不适用于任何标准的 UNIX 工具。在发布任何解决方案时,丢弃独立的正则表达式是没有用的,因为所有工具都支持不同的正则表达式风格,有些工具具有不同的选项来启用不同的风格。始终在支持该正则表达式的工具的上下文中显示一个正则表达式,否则它就是这么多的噪音。
    【解决方案4】:

    如果换行符前面有数字或逗号,只需删除它:

    perl -pe 'chomp if /[\d,]$/' input-file > output-file
    
    • -p逐行读取输入并打印结果
    • chomp 如果出现在末尾,则删除换行符
    • \d 匹配一个数字
    • $ 匹配行尾

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多