如何使用 awk/cut 获取有空间的列数据

如何使用 awk/cut 获取有空间的列数据

我有以下格式的数据:

 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD

现在我想按列获取数据,我正在使用以下命令

awk '{print $1,$2}' 

但由于第 2 列有空格,它给出了以下输出:

16 SQL*Plus      
  16 TOAD

而我想要的是:

16 SQL*Plus  
   16 TOAD background query session   

答案1

如果列由制表符分隔,您可以指定制表符作为字段分隔符。这将阻止 awk 将空格视为单独列的默认行为。

cat <data file> | awk -F"\t" '{print $1, $2}'

root@ubuntu32:/tmp# cat testtext | awk -F"\t" '{print $1, $2}'
16 SQL*Plus
16 TOAD background query session

答案2

喜欢@Costas的建议,另一个选择是:

gawk '
  {
    f1=substr($0,2,2)
    f2=substr($0,4,36)
    gsub(/ *$/, "", f2)
    print f1 " " f2
  }
'

答案3

做到这一点的一种方法可能涉及unexpand.expand可以找到它的描述和实用程序这里:

  • unexpand实用程序应将文件或标准输入复制到标准输出,将<blank>每行开头的字符转换为最大字符数,然后是填充最初由翻译字符填充的相同列位置所需的<tab>最小字符数。默认情况下,制表位应设置在每八列位置。每个都应复制到输出,并应导致制表符计算的列位置计数递减;计数永远不会减少到小于一的值。<space><blank><backspace>

不过你可能会想要这个-a开关。

  • -a- 除了翻译<blank>每行开头的字符之外,还将<blank>紧邻制表位之前的两个或多个字符的所有序列翻译为填充最初由制表符填充的相同列位置所需的最大<tab>字符数,然后是填充所需的最小字符数<space>翻译的<blank>字符。

这是一个简单的实用程序,用于将许多空格按顺序转换为制表符。这样你就可以...

unexpand -a <<\IN | cut -f1
 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD
IN

...打印...

 16 SQL*Plus
 16 TOAD background query session

我只是cut在那里使用,但如果你愿意,你可以使用awk或其他任何东西。我只是建议它,因为你几乎肯定已经安装了它,它使用起来非常简单,而且速度非常快。它通过交换分隔符解决了空间问题 - 而且非常容易做到这一点。

我还使用此处文档只是为了展示它是如何工作的,但您可能想要这样做......

unexpand -a <infile | filter program

相关内容