gpt4 book ai didi

linux - awk、分割并打印一系列列

转载 作者:太空宇宙 更新时间:2023-11-04 04:50:01 37 4
gpt4 key购买 nike

我想创建一个新文件,其中包含从现有文件中选择的列。我想根据“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)

代码:

awk '$1 == "X" {print $1, $2, $4, $5, split($10,a,":"), a[1]}' file.txt > test.txt

最佳答案

我想我会以不同的方式处理这个问题。我只是在原位重写这些字段,而不是捕获数组中字段 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
}

这里对$3的处理有点弱; awk 没有真正的解决方案来消除列。如果您无法处理额外的分隔符,则可能需要更详细的内容:

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

此解决方案在最后一个 s 之前缺少一个逗号,因为 OF​​S 将作为该字符串的第一个字符包含在内。这是 l̶a̶z̶i̶n̶e̶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
}

我们在这里使用 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

关于linux - awk、分割并打印一系列列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60012239/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com