Shell/awk 读取一列文件并组合列以生成 TSV 文件的脚本
Shell/awk script to read a column of files and combining columns to make a TSV file
我有 600 多个文件,我需要从每个文件中提取单列并将它们写入输出文件。我当前的代码完成这项工作,它从所有文件中获取列并将列一个接一个地写入输出文件。但是,我的输出文件中需要两件事:
- 在输出文件中,我需要将输入文件中的每一列作为一个新列添加到输出文件(最好是 TSV 文件)中,而不是一个接一个地添加列。
- 列名将替换为文件名。
我的示例代码:
for f in *; do cat "$f" | tr "\t" "~" | cut -d"~" -f2; done >out.txt
示例输入:
file01.txt
col1 col2 col3
1 2 3
4 5 6
7 8 9
10 11 12
file02.txt
col4 col5 col6
11 12 13
14 15 16
17 18 19
110 111 112
我当前的输出:
col2
2
5
8
11
col5
12
15
18
111
预期输出:
file01.txt file02.txt
2 12
5 15
8 18
11 111
你可以这样使用 awk:
awk -v OFS='\t' 'BEGIN {
for (i=1; i<ARGC; i++)
printf ARGV[i] OFS;
print ARGV[i];
}
FNR==1 { next }
{
a[FNR]=(a[FNR]==""?"":a[FNR] OFS)
}
END {
for(i=2; i<=FNR; i++)
print a[i];
}' file*.txt
file01.txt file02.txt
2 12
5 15
8 18
11 111
我有 600 多个文件,我需要从每个文件中提取单列并将它们写入输出文件。我当前的代码完成这项工作,它从所有文件中获取列并将列一个接一个地写入输出文件。但是,我的输出文件中需要两件事:
- 在输出文件中,我需要将输入文件中的每一列作为一个新列添加到输出文件(最好是 TSV 文件)中,而不是一个接一个地添加列。
- 列名将替换为文件名。
我的示例代码:
for f in *; do cat "$f" | tr "\t" "~" | cut -d"~" -f2; done >out.txt
示例输入:
file01.txt
col1 col2 col3
1 2 3
4 5 6
7 8 9
10 11 12
file02.txt
col4 col5 col6
11 12 13
14 15 16
17 18 19
110 111 112
我当前的输出:
col2
2
5
8
11
col5
12
15
18
111
预期输出:
file01.txt file02.txt
2 12
5 15
8 18
11 111
你可以这样使用 awk:
awk -v OFS='\t' 'BEGIN {
for (i=1; i<ARGC; i++)
printf ARGV[i] OFS;
print ARGV[i];
}
FNR==1 { next }
{
a[FNR]=(a[FNR]==""?"":a[FNR] OFS)
}
END {
for(i=2; i<=FNR; i++)
print a[i];
}' file*.txt
file01.txt file02.txt
2 12
5 15
8 18
11 111