我的文件夹中有很多txt文件。每个文件包含一行这种格式;
8852 0.53451 0.55959 0.65494 0.36047
我想在下一行添加一个固定数字,其余 4 列从原始行复制,如下所示
8852 0.53451 0.55959 0.65494 0.36047
9997 0.53451 0.55959 0.65494 0.36047
到目前为止,我设法通过文件夹内的以下命令添加 9997
find *.txt -exec sh -c 'echo "9997" >> $0' {} \;
并设法复制其余 4 列
for files in .; do awk '{$1=""; print substr($0,2)}' *.txt;done
但它在输出中打印出来,而不是在每个文件的下一行中打印出来。
我还没能把它们放在一起,感觉我已经很接近了,但可能方向错了。我尝试了 awk '{print "\n"$2,$3,$4,$5}' 但它也不起作用。
任何帮助表示赞赏!谢谢。
答案1
我建议awk '{print; $1 = 9997; print}'
$ echo '8852 0.53451 0.55959 0.65494 0.36047' | awk '{print; $1 = 9997; print}'
8852 0.53451 0.55959 0.65494 0.36047
9997 0.53451 0.55959 0.65494 0.36047
您提到将转换应用于多个文件:您可以使用循环来执行此操作
for f in *.txt; do awk '{print; $1 = 9997; print}' "$f"; done
或(递归地)使用find
find . -name '*.txt' -exec awk '{print; $1 = 9997; print}' {} \;
但是,除非您有带有扩展名的最新版本的 GNU Awk -i inplace
,否则结果将被连接并写入标准输出。
答案2
给定你的评论如果您要更新文件in this directory and other directories next to it.
,假设您有一个目录,该目录下还有其他目录,其中有您要修改的文件。这是在 cd 到该顶级目录后执行此操作的方法:
find . -maxdepth 2 -mindepth 2 -exec awk -i inplace '{print} $1==8852{$1=9997; print}' {} +
上面使用 GNU awk 进行“就地”编辑,并使用 GNU find 进行+
.如果您没有 GNU 工具,假设您的文件名不包含换行符:
tmp=$(mktemp)
while IFS= read -r file; do
awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"
如果您不想更改不包含8852
以下内容的文件的时间戳:
tmp=$(mktemp)
while IFS= read -r file; do
awk '$1==8852{f=1; exit} END{exit !f}' "$file" &&
awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"
答案3
因此,您有很多文件,并且它们有一行采用以下格式。
8852 0.53451 0.55959 0.65494 0.36047
现在您想要打开文件并将第一列替换为您选择的值,其余部分保持原样,然后将其附加到下一行。
8852 0.53451 0.55959 0.65494 0.36047
9997 0.53451 0.55959 0.65494 0.36047
如果我正确回答了这个问题,那么下面的内容应该有效。
for file in ``find . -name "*.txt"``; do awk '{print "\n9997 "$2,$3,$4,$5}' $file >> $file; done
获取文件夹中的所有文件,使用 awk 读取文件并获取 2345 列,并为第一列添加您的值并将其附加到同一文件中。
如果我问错了你的问题,我深表歉意。