Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何修剪前导和尾随空格,并用制表符(/t)替换它,使其从文件的每一行组织起来?_Unix_Awk_Sed_Trim - Fatal编程技术网

Unix 如何修剪前导和尾随空格,并用制表符(/t)替换它,使其从文件的每一行组织起来?

Unix 如何修剪前导和尾随空格,并用制表符(/t)替换它,使其从文件的每一行组织起来?,unix,awk,sed,trim,Unix,Awk,Sed,Trim,我正在使用Sun solaris 5.10。在我的shell脚本中,我正在将SQLO/p数据假脱机到Unix文件中,稍后我将使用该文件使用mailx发送邮件。 我的问题是,当vim或cat在unix中处理假脱机文件时,数据以sqlo/p的形式组织。然而,当将其重定向到邮件或将其复制到word文件中以检查数据时,会出现混乱。我希望我的o/p与sql o/p的顺序相同 JOB_ID|JOB_NME |START_DTE_TIM |END

我正在使用Sun solaris 5.10。在我的shell脚本中,我正在将SQLO/p数据假脱机到Unix文件中,稍后我将使用该文件使用mailx发送邮件。 我的问题是,当vim或cat在unix中处理假脱机文件时,数据以sqlo/p的形式组织。然而,当将其重定向到邮件或将其复制到word文件中以检查数据时,会出现混乱。我希望我的o/p与sql o/p的顺序相同

JOB_ID|JOB_NME                 |START_DTE_TIM                 |END_DTE_TIM           |DURATION                      |STATUS
------------|------------------------------|------------------------------|----------------------|------------------------------|------------------------------
           5|J191-JOB1 |18/08/2020 12:37:09 AM        |18/08/2020 12:37:13 AM|4 Seconds                     |SUCCESS
           4|J191-JOB12   |18/08/2020 12:37:09 AM        |                      |                              |FAILED
           1|J190-JOB3   |18/08/2020 12:37:10 AM        |18/08/2020 12:37:14 AM|4 Seconds                     |SUCCESS
           2|J190-JOB15             |18/08/2020 12:37:09 AM        |18/08/2020 12:37:15 AM|6 Seconds                     |SUCCESS

如何使用awk、sed或trim实现文件内容的组织。

有趣的是,第二行保留了列的大小。因此,您可以读取文件的第二行并从中获取列宽,然后使用宽度缩进所有其他列

我将文件保存在名为
a.txt的文件中,并执行了以下操作:

# Execute awk with | as separator
$ awk -F'|' '
   # If first file and line number 2
   FNR==NR&&NR==2{
      # save the lengths of all fields in array named s
      for (i=1;i<=NF;++i) s[i]=length($i)
   }
   # if the second file
   FNR!=NR{
        # for each field
        for (i=1;i<=NF;++i) {
           # print the field
           # if the first field (i==1) then format the field to the right,
           # otherwise to the left
           # use the variable length %*s specifier to pass the length as parameter
           printf("%" (i==1?"":"-") "*s%s",
                 # then lenght of the field
                 s[i],
                 # remove leftovers tabs and spaces in front and after values
                 gensub(/^[ \t]*([^ \t].*[^ \t])[ \t]*$/, "\\1", "1", $i), 
                 # if its the last field, print a newline, otherwise print a |
                 i!=NF?"|":"\n");
           }
      # pass the file twice
     }' a.txt a.txt
      JOB_ID|JOB_NME                       |START_DTE_TIM                 |END_DTE_TIM           |DURATION                      |STATUS                        
------------|------------------------------|------------------------------|----------------------|------------------------------|------------------------------
           5|J191-JOB1                     |18/08/2020 12:37:09 AM        |18/08/2020 12:37:13 AM|4 Seconds                     |SUCCESS                       
           4|J191-JOB12                    |18/08/2020 12:37:09 AM        |                      |                              |FAILED                        
           1|J190-JOB3                     |18/08/2020 12:37:10 AM        |18/08/2020 12:37:14 AM|4 Seconds                     |SUCCESS                       
           2|J190-JOB15                    |18/08/2020 12:37:09 AM        |18/08/2020 12:37:15 AM|6 Seconds                     |SUCCESS                       
#以|作为分隔符执行awk
$awk-F'|''
#如果第一个文件和行号为2
FNR==NR&&NR==2{
#保存名为s的数组中所有字段的长度

对于(i=1;i
与sql o/p的顺序相同。
数据的顺序是否改变?或者数据的填充顺序是否相同?我实际上指的是o/p格式。例如:标题分隔,列分隔,由于列值之间的尾随空间不规则,它会移到一边。但在执行vim或cat时,它显示了非常适合查看的效果。我是这样做的不知道是否已从电子邮件中删除了80个字符的水平限制。如果没有,这可能解释了为什么会出现这种情况。HTML可能会对您有所帮助,但我怀疑这在纯文本邮件中是否有效。请查找sql客户机的选项以取消输出的修饰,可能是
--无标题
,--fieldSep=“|”`为了使您的代码*nix cmd行友好(将输出的各个阶段管道化到最终的printf(“%20s\t%20s\t%2d\n”,$1,$2,$3)`诸如此类。祝您好运。您好@KamilCuk,谢谢您的回复。我在运行上述脚本时遇到了awk错误:#!/bin/ksh awk-F'|''FNR==NR&&NR==2{for(i=1;我希望这在linux中能起作用,但在sun solarisgensub中不行,用gsub替换它(gsub与gensub不同)[注意:我使用/usr/xpg4/bin/awk作为awk-F在solaris中不起作用]并且我得到了错误/usr/xpg4/bin/awk:line 18(NR=9):变量“”不能用作函数我想它应该在
(i==1?”:“-”)
。如果(i==1){fmt=“%*s%s”;}其他{fmt=“%-*s%s”;};printf(fmt,其余)
可能更安全。
awk -F'|' '
FNR==NR&&NR==2{
    for (i=1;i<=NF;++i) s[i]=length($i)
}
FNR!=NR{
    for (i=1;i<=NF;++i) {
        gsub(/^[ \t]*\([^ \t].*[^ \t]\)[ \t]*$/, "\\1", $i)
        if (i == 1) { fmt = "%*s%s"; }
        else { fmt = "%-*s%s"; }
        printf(fmt, s[i], $i, i!=NF?"|":"\n");
    }
}' a.txt a.txt