在 Linux 中设置文本格式

在 Linux 中设置文本格式

我正在尝试格式化需要导入系统的文件中的数据。该系统单行文本的长度不超过 65 个字符。因此,我尝试将描述列中的文本格式化为多行,如下面的示例所示。如果是单行Linux命令,那对用户来说真的很有帮助,你能检查一下是否可行吗?

文件中的示例输入 -

 
深度描述
(英尺)-
12370.0 LS:Mdst、blsh gry、sft、occ modfirm、crpxln、prly、arg、SLTST:blk、firm-mod hd、amor、gt、mod calc、CLST:lt gry-m gry、sft、amor、wxy
12400.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、arg、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、CLST:lt gry-m gry、occ rdsh gry、modfirm , 爱, wxy, tr CHK
12430.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、arg、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、SH:blk-dk gry、modfirm、blky-plty、 OCC 英国人,wxy
12460.0 SH:blk-dk gry、modfirm、blky-plty、occ brit、ea、SLTST:blk-dk gry、firm-mod hd、amor、gt、mod calc、SST:gry-dk gry、wl consol、vf , ang, p srt, cotd, slily calc cmt, 无氟

深度和描述及其下面的行被视为标题。深度列包含所有数字,描述列包含应格式化为多行以便系统接受数据的文本。

Linux 命令所需的输出 -

 
深度描述
(英尺)-
12370.0 LS:Mdst、blsh gry、sft、occ modfirm、
        crpxln、prly、arg、SLTST:blk、firm-mod hd、
        amor、gt、mod calc、CLST:lt gry-m gry、sft、
        爱,wxy
12400.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、
        arg,SLTST:blk-dk gry,firm-mod hd,amor,
        gt、mod calc、CLST:lt gry-m gry、occ rdsh gry、
        mod 坚定、爱情、wxy、tr CHK
12430.0 LS:Mdst、blsh gry、modfirm、crpxln、chky、
        arg,SLTST:blk-dk gry,firm-mod hd,amor,
        gt,mod calc,SH:blk-dk gry,modfirm,
        blky-plty、occ 英国、wxy
12460.0 SH:blk-dk gry、modfirm、blky-plty、occ Brit、
        ea、SLTST:blk-dk gry、firm-mod hd、amor、gt、
        mod calc,SST:gry-dk gry,wl consol,vf,ang,
        p srt、cotd、slily calc cmt、无氟

注意 - 用户将无法在其计算机上安装任何 Linux 软件包。 (示例 - 标准杆)

答案1

与标准awk

{ printf("%s\t", $1) }
{
    linelen = 8;  # assume 8 spaces for the first field

    for (i = 2; i <= NF; ++i) {
        wordlen = length($i);

        if (wordlen + linelen > 65) {
            # break output line since adding next word
            # would make it too long
            printf("\n\t");
            linelen = 8; # count tab as 8 spaces
        }

        if (i < NF) {
            printf("%s ", $i);
            linelen += wordlen + 1; # +1 for the space
        } else {
            printf("%s\n", $i);
        }
    }
}

测试:

$ awk -f script.awk file.in
Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
        SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt
        gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt
        gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk
        gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
        blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk
        gry, wl consol, v f, ang, p srt, cotd, slily calc cmt, no
        fluor

唯一的缺点是这会在大多数输出​​行上留下尾随空格。您可以通过传递输出来剥离这些内容sed 's/ $//'

答案2

使用 GNU sed

$ sed -r '3,$s/(.{55} )/\1\n\t/g' file.in
Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly,
        arg, SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST:
        lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST:
        lt gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SH:
        blk-dk gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea,
        SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SST:
        gry-dk gry, wl consol, v f, ang, p srt, cotd, slily calc
        cmt, no fluor

这会在行尾留下空格,可以通过运行它来去除这些空格sed 's/ $//'

该表达式3,$s/(.{55} )/\1\n\t/g将用同样的 55 个字符(和空格)替换任何 55 个字符,后跟一个空格,后跟一个换行符和一个制表符缩进。对于该行上模式的所有匹配,都会重复此操作。

答案3

awk解决方案:

awk 'NR<=2{ print }NR>2{ c=0; r=$1; 
            for(i=2;i<=NF;i++) { 
               if ((length(r) + length($i)) > (!c? 65:61)) { c++; printf "%s\n\t",r; r=$i } 
               else { r=r FS $i } if(i==NF) printf "%s",r } 
            print "" 
     }' file
  • NR<=2{ print }- 按原样打印前两行

  • r变量,包含每个已处理/格式化的行


输出:

Depth   Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg,
    SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
    gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m
    gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk gry,
    mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST:
    blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk gry,
    wl consol, v f, ang, p srt, cotd, slily calc cmt, no fluor

相关内容