我试图将不同子文件夹中的几千个文件连接到一个文件中,并将每个连接文件的名称插入为第一列,以便我知道每个数据行来自哪个文件。本质上是从这样的事情开始:
编辑:我忽略了每个文件都有相同的标头,因此我相应地更新了请求。
Folder1
file1.txt
A B C
123 010 ...
456 020 ...
789 030 ...
Folder2
file2.txt
A B C
abc 100 ...
efg 200 ...
hij 300 ...
Run Code Online (Sandbox Code Playgroud)
并输出:
CombinedFile.txt
A B C
file1 123 010 ...
file1 456 020 ...
file1 789 030 ...
file2 abc 100 ...
file2 efg 200 ...
file2 hij 300 ...
Run Code Online (Sandbox Code Playgroud)
读完这篇文章后,我尝试了以下代码,但最终出现语法错误(抱歉,我对 awk 非常陌生!)
shopt -s globstar
for filename in path/**/*.txt; do
awk '{print FILENAME "\t" $0}' *.txt > CombinedFile.txt
done
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!
这个单曲awk应该能够在没有任何循环的情况下完成:
shopt -s globstar
awk 'FNR == 1 {
f = FILENAME
gsub(/^.*\/|\.[^.]+$/, "", f)
if (NR > 1) # show header for first file only
next
}
{
print f, $0
}' path/**/*.txt > CombinedFile.txt
cat CombinedFile.txt
file1 123 010
file1 456 020
file1 789 030
file2 abc 100
file2 efg 200
file2 hij 300
Run Code Online (Sandbox Code Playgroud)