Linux下使用for循环与awk重定向并格式化脚本输出
解决方法
嘿,这个需求用awk就能轻松搞定,它特别擅长处理这种按字段分割的文本流。直接用下面的命令就行:
my_script < variables | awk '{ for (i=3; i<=NF; i+=5) { if (i+1 <= NF) { printf "some_text %s@%s some_more_text %s ", $i, $(i+1), $(i+1) } } print "" }'
为啥这么写?给你拆解一下:
- 首先
my_script < variables就是你原来执行脚本的命令,我们用管道|把它的输出传给awk处理 - awk里的
NF是个内置变量,代表当前行里的总字段数(也就是你的输出里的单词总数) - 循环从第3个字段开始(
i=3),每次跳5个字段(i+=5)——这是根据你给的示例推导的,看你示例里下一组目标字段是第8个,3+5正好到8,完美匹配你的期望输出 - 加个
if (i+1 <= NF)的判断是为了避免最后一行只剩单个字段时出错,保证我们每次都能拿到成对的X和Y printf就是按你要的模板输出:some_text X@Y some_more_text Y,其中$i是第i个字段(也就是你说的col_3),$(i+1)是下一个字段(col_4)- 最后
print ""是在输出末尾加个换行,免得终端提示符和输出挤在一起看着难受
测试验证一下
假设你的脚本输出是:
text1 text3 textext3 texxt6 textxx2 textx3 textext3 textext1 text4 text4 text1x textx2 text5 textxt0
运行上面的命令后,输出会是:
some_text textext3@texxt6 some_more_text texxt6 some_text textext1@text4 some_more_text text4 some_text text5@textxt0
完全和你想要的格式一致!
要是你发现分组的步长不是5(比如我理解错了你的规则),只需要改循环里的i+=5就行——比如如果是每4个字段取一次,就改成i+=4,灵活得很。
内容的提问来源于stack exchange,提问作者Sann
相关产品推荐
相关产品推荐

