如何使用awk结合for循环对二维矩阵多列进行采样?
awk批量提取固定步长列的解决方案
方法1:awk内部for循环直接生成列号
直接在awk脚本里用for循环遍历目标列号,不用手动罗列所有$n:
awk -F " " '{ # 从900开始,每次加25,覆盖900到1875的40列 for(i=900; i<=1875; i+=25){ printf "%s ", $i } print "" }' filename.txt > test.txt
如果不想手动计算最后一列的数值,也可以用循环次数控制,更灵活:
awk -F " " '{ start=900; step=25; count=40 for(i=0; i<count; i++){ col = start + i*step printf "%s%s", $col, (i<count-1 ? " " : "\n") } }' filename.txt > test.txt
改start(起始列)、step(步长)、count(提取列数)三个变量就能适配不同场景。
方法2:外部生成列号列表传给awk
先用seq命令生成目标列号的逗号分隔列表,再让awk按列表提取:
# 生成900到1875、步长25的列号,用逗号连接 cols=$(seq -s, 900 25 1875) # 分割列号列表并循环输出对应列 awk -F " " -v cols="$cols" '{ split(cols, arr, ",") for(i in arr){ printf "%s%s", $arr[i], (i<length(arr) ? " " : "\n") } }' filename.txt > test.txt
这种方法适合需要先确认列号列表的场景,生成的cols变量可通过echo $cols验证是否正确。
内容的提问来源于stack exchange,提问作者Changwan Sun
相关产品推荐
相关产品推荐

