将文件名列添加到数百个文件bash
我有数百个约 1000 万行的全基因组关联研究文件。对于file1.txt:
SNP BP B SE P
123 12 0.1 0.01 0.1
...
我想在每个文件的末尾添加一列,其中只包含该文件的名称,以便最终结果file1.txt是:
SNP BP B SE P name
123 12 0.1 0.01 0.1 file1.txt
...
我想对数百个文件执行此操作。目前我可以使用以下方法添加一列:
for file in *.txt; do awk 'BEGIN{OFS="t"}{print $0, FILENAME}' $file; done
这将打印整个文件,但不会覆盖现有文件。我只想向已经存在的数据框添加一列。任何建议非常感谢!
回答
tmp=$(mktemp) || { ret="$?"; printf 'Failed to create temp filen'; exit "$ret"; }
for file in *.txt; do
awk 'BEGIN{OFS="t"} {print $0, (FNR>1 ? FILENAME : "name")}' "$file" > "$tmp" &&
mv -- "$tmp" "$file" || exit
done
如果你有 GNU awk 并且没有太多超过 shell 参数限制的文件,你可以只使用对 awk 的调用,没有周围的 shell 循环并显式创建临时文件(它仍然会在幕后使用临时文件,就像所有具有“就地”编辑选项的工具一样):
awk -i inplace 'BEGIN{OFS="t"} {print $0, (FNR>1 ? FILENAME : "name")}' *.txt