【问题标题】:Unix script for converting single line delimited to Multiline file用于将单行分隔符转换为多行文件的 Unix 脚本
【发布时间】:2014-12-07 02:38:54
【问题描述】:

我有一个用 Cedilla 分隔的文件,但记录在一行中。我必须将其转换为多行文件。

样本记录:

P002365Ç1200ÇMastercardÇcarolinaÇBasildonÇEnglandÇUnited kingdomÇP002368Ç2100ÇVisaÇGouyaÇEchucaÇVictoriaÇAustraliaÇP002373Ç3600ÇMastercardÇRenee ElisabethÇTel AvivÇTel AvivÇIsraelÇP002382Ç6300ÇDinersÇbarbaraÇHyderabadÇAndhra PradeshÇIndia

需要转换为:

P002365Ç1200ÇMastercardÇcarolinaÇBasildonÇEnglandÇUnited Kingdom    
P002368Ç2100ÇVisaÇGouyaÇEchucaÇVictoriaÇAustralia    
P002373Ç3600ÇMastercardÇRenee ElisabethÇTel AvivÇTel AvivÇIsrael    
P002382Ç6300ÇDinersÇbarbaraÇHyderabadÇAndhra PradeshÇIndia

我们可以使用 awk 命令来实现吗?

【问题讨论】:

标签: unix awk


【解决方案1】:

你可以这样使用:

awk -FÇ '{for (i=1;i<=NF;++i) printf "%s%s", $i, (i%7==0?RS:FS)}' file
P002365Ç1200ÇMastercardÇcarolinaÇBasildonÇEnglandÇUnited kingdom
P002368Ç2100ÇVisaÇGouyaÇEchucaÇVictoriaÇAustralia
P002373Ç3600ÇMastercardÇRenee ElisabethÇTel AvivÇTel AvivÇIsrael
P002382Ç6300ÇDinersÇbarbaraÇHyderabadÇAndhra PradeshÇIndia

这里发生的事情的细分:

  • -FÇ - 此命令行参数将 FS 变量(字段分隔符)设置为 Ç 字符
  • for 循环(在每一行上执行)从 1 循环到 NF(字段数)
  • 在每次迭代中,都会执行一个printf,打印两个字符串(%s%s),第一个是实际字段的内容($i),第二个是两个选项之一:
    1. 如果字段编号是 7* 的倍数,则插入换行符(RS 记录分隔符),
    2. 否则将打印FS。 (定义为Ç 字符)。

* 数字 7 是“任意”使用的,因为它是根据您提供的示例输出拆分记录的定义。

【讨论】:

  • RS(记录分隔符)在这种情况下是换行符吗?
  • @Lix 默认是,是的。
  • 正如我所怀疑的那样:P 酷.. 我将添加这里发生的事情的细分(主要是为了确保我自己理解它)。如果我弄错了,请告诉我:)
  • @Lix 我刚刚编辑过,希望这能解释更多。如果您有更多细节要添加,请随时编辑。
  • 太棒了 :) 我真的应该更多地关注 awk 标签...真的帮助我重新学习我最喜欢的工具之一...
【解决方案2】:

这可能对你有用(GNU sed):

sed 's/Ç/\n/7;P;D' file

这会将每 7 个 Ç 替换为换行符。

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多