Linux Awk、拆分和打印一系列列

Linux Awk、拆分和打印一系列列,linux,awk,split,multiple-columns,Linux,Awk,Split,Multiple Columns,我想用现有文件中的select列创建一个新文件。我想根据“X”选择行,然后按原样打印列1、2、4和5。然后,我希望根据分隔符“:”将第10列拆分到最后一列(50),并仅提取这些列的第一部分 例如: 第10列到第50列看起来像->10:a:b:c:d:e:f(我只需要这些列中的“10”) 到目前为止,我有以下内容,但我不确定如何为拆分和打印[1]部分执行一系列列,因此这里我只有第10列,但我希望它在第50列中执行相同的操作 输入示例: X 2 3 4 5 6 7 8 9 10:a:b:c 11:d

我想用现有文件中的select列创建一个新文件。我想根据“X”选择行,然后按原样打印列1、2、4和5。然后,我希望根据分隔符“:”将第10列拆分到最后一列(50),并仅提取这些列的第一部分

例如: 第10列到第50列看起来像->
10:a:b:c:d:e:f
(我只需要这些列中的“10”)

到目前为止,我有以下内容,但我不确定如何为拆分和打印[1]部分执行一系列列,因此这里我只有第10列,但我希望它在第50列中执行相同的操作

输入示例:

X 2 3 4 5 6 7 8 9 10:a:b:c 11:d:e:f 12:g:h:i (all the way to 50)
示例输出:

X 2 4 5 10 11 12 (all the way to 50)
代码:


我想我应该换一种方式。我没有捕获数组中字段10到50中第一个“:”分隔的子字段,而是就地重写这些字段

$1 == "X" {
  $3=""
  for (i=6; i<=9; i++)
    $i=""
  for (i=10; i<=NF; i++)
    $i=substr($i,0,index($i,":")-1)
  print
}
此解决方案在最后一个
s
之前缺少逗号,因为OFS将作为该字符串的第一个字符包含。这是一个l̶a̶z̶i̶n̶e̶s̶s̶̶s̶优化,以避免不必要的测试,但如果您愿意,您也可以改变这一点以避免临时变量:

$1 == "X" {
  printf "%s", $1 OFS $2 OFS $4 OFS $5
  for (i=10; i<=NF; i++)
    printf "%s", OFS substr($i,0,index($i,":")-1)
  printf ORS
}

请将您的问题包括简洁、可测试的示例输入和预期输出。谢谢您的回答!我一直收到一个语法错误:bash:syntax error靠近意外标记“”(“没关系,我将脚本保存为可执行文件后它就工作了。谢谢!耶!我也修复了测试输出--如果指定了程序文件,awk需要
-f
选项。
$1 == "X" {
  s=""
  for (i=10; i<=NF; i++)
    s=s OFS substr($i,0,index($i,":")-1)
  print $1,$2,$4,$5 s
}
$1 == "X" {
  printf "%s", $1 OFS $2 OFS $4 OFS $5
  for (i=10; i<=NF; i++)
    printf "%s", OFS substr($i,0,index($i,":")-1)
  printf ORS
}
$ cat input
X 2 3 4 5 6 7 8 9 10:a:b 11:c:d 12:e:f:g
$ awk -f test.awk input
X 2 4 5 10 11 12