首页 > 解决方案 > 找到第一行的第一个数值并将其插入到第二行的末尾,对同一目录中的多个文件执行此操作

问题描述

我有多个文件要在一个唯一目录中处理。它们共享相同的扩展名 (.dat),但它们的名称可以是任何名称。每个文件都有一个由随机文本组成的第一行,其中必须捕获第一个遇到的数值,然后将其放在第二行的末尾。然后是许多其他行。

第 1 行和第 2 行的字段数未知,作为数值在第 1 行中的位置。第一行还可以包含多个数值。

这目前看起来像示例,在“xxx.dat”中包含“850”,文件如下:

典型输入:

field11 field21 ... 850 ... 520 ... blabla ... 1100 ... fieldi1
field12 field22 ... fieldj2
field13 field23 ... fieldk3
...
field1n field2n ... fieldzn

所需的输出:

field11 field21 ... 850 ... 520 ... blabla ... 1100 ... fieldi1
field12 field22 ... fieldj2 850
field13 field23 ... fieldk3
...
field1n field2n ... fieldzn

理想情况下,一个独特的命令或循环将处理所有 .dat 文件。

我是 sed 和 awk 的初学者,不幸的是远不能解决这个问题。请问我有什么建议或解决方案吗?谢谢。

标签: loopsawkinsertnumeric

解决方案


你可以使用这个 shell 脚本:

#!/bin/sh

# make a temp file

trap "rm -f '$tmp'; exit" INT TERM

if command -v mktemp 2>&1 >/dev/null; then
    tmp=$(mktemp)
else
    tmp=edit.tmp
fi

[ -e "$tmp" ] && exit 1

# edit .dat files

for i in *.dat; do
    awk '
        NR==1 {while ($(++i) ~ /[^0-9]/); num=$i}
        NR==2 {print $0,num}
        NR!=2' "$i" > "$tmp"  &&
    mv "$tmp" "$i"
done

rm -f "$tmp"

它抓取第 1 行中的第一个数字字段,并将其附加到第 2 行。

.dat在仅包含您要编辑的 s的目录中运行。

说出您的目标是哪个操作系统平台很有帮助。


推荐阅读