gpt4 book ai didi

regex - 选择奇数列,然后将连续行的字段放在一起

转载 作者:行者123 更新时间:2023-11-29 08:57:27 25 4
gpt4 key购买 nike

我有一个数据文件,需要使用正则表达式进行转换。更具体地说,我需要保持前 6 列相同,并且从第 7 列开始,只选择奇数列,然后将每对连续行的字段放在一起。我知道这听起来有点复杂,所以我将通过一个例子来阐明这一点。这是我的原始数据文件(它可以有任意数量的列):

A B C D E F 11 12 13 14 15 16 17 18
A B C D E F 21 22 23 24 25 26 27 28
A B C D E F 31 31 33 34 35 36 37 38
A B C D E F 41 42 43 44 45 46 47 48
A B C D E F 51 52 53 54 55 56 57 58
A B C D E F 61 62 63 64 65 66 67 68
A B C D E F 71 72 73 74 75 76 77 78
A B C D E F 81 82 83 84 85 86 87 88

我发现我可以保留前 6 列,然后删除奇数列

awk '{for (i = 1; i <= NF; i++) if (i < 7 || i % 2 == 1) printf $i OFS}; {print ""}

结果是这样的:

A B C D E F 11 13 15 17 
A B C D E F 21 23 25 27
A B C D E F 31 33 35 37
A B C D E F 41 43 45 47
A B C D E F 51 53 55 57
A B C D E F 61 63 65 67
A B C D E F 71 73 75 77
A B C D E F 81 83 85 87

但之后我必须将每对连续行的字段放在一起,如下所示:

A B C D E F 11 21 13 23 15 25 17 27
A B C D E F 31 41 33 43 35 45 37 47
A B C D E F 51 61 53 63 55 65 57 67
A B C D E F 71 81 73 83 75 85 77 87

我一直想用sed或者awk来做整个过程,因为我的数据文件很大,我需要高效地转换它们,但我也想不出办法做第二次转换。任何帮助将不胜感激。

最佳答案

这是使用 GNU awk 的一种方法。像这样运行:

awk -f script.awk file.txt

script.awk 的内容:

{
getline line
split(line, array)
k = 6
n = ((NF - k) % 2 == 0) ? 1 : 0

for (i=1; i<=k; i++) {
printf $i OFS
}

for (j=7; j<=NF-n; j+=2) {
x = $j OFS array[j]
printf (j < NF - n) ? x OFS : x "\n"
}
}

结果:

A B C D E F 11 21 13 23 15 25 17 27 
A B C D E F 31 41 33 43 35 45 37 47
A B C D E F 51 61 53 63 55 65 57 67
A B C D E F 71 81 73 83 75 85 77 87

关于regex - 选择奇数列,然后将连续行的字段放在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13027807/

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