我是awk的新手,所以我希望有人能帮助
我有55个文本文件(在TAB中,有类似的以.txt结尾的命名(,所有文件都包含55行4列。没有缺少任何行或列。唯一的区别是文件中的值。它们看起来类似于下面的(现在只包含4行和3个文件(
Row1 355 389 623
Row2 58 906 1373
Row3 338 3 30
Row4 2 976 0
Row1 543 31 6642
Row2 0 0 453
Row3 45 5 42
Row4 425 12 8
Row1 452 6 352
Row2 765 21 54
Row3 0 45 999
Row4 451 765 3
我想将第一列(名称(添加一次,然后将所有文件中的第三列添加为一列编辑:如果可能的话,文件名输出应该是这样的:
1.txt 2.txt 3.txt
Row1 389 31 6
Row2 905 0 21
Row3 3 5 45
Row4 976 12 765
我试过这个代码
paste * | awk 'FNR==NR{a[FNR]=$1; next} {print a[FNR],$3}' *.txt > output.txt | column -t
但是,它只添加前两个文件的值。其他文件中的值不存在。我能做什么?谢谢
你可以试试这个awk:
awk -F 't' '
FNR==NR {table[FNR] = $1}
{table[FNR] = table[FNR] "t" $3}
END {
for (i=1; i<=FNR; i++) {
print table[i]
}
}' *
FNR的最后一个(第55个(值用于打印数组,因此,如果文件的行数不相同,则需要对此进行处理。
如果你想使用paste
,也许可以这样做:
paste * |
awk '
{
printf "%s", $1
for (i=3; i<55*4; i+=4) {
printf "t%s", $i
}
printf "n"
}'
55*4
是文件数乘以列数。硬编码。如果有必要的话,有各种各样的计数方法。
假设:
- 输入/输出字段分隔符为
<TAB>
- 所有输入文件都包含相同数量的行
- 所有行至少有3列
- 无需对输入文件进行排序(即,
Row1
始终在第1行,Row2
始终在第2行,等等( *.txt
将按所需顺序扩展到文件列表(例如,1.txt1
、2.txt
、3.txt
等(;否则,OP可能需要在将文件名提供给建议的解决方案之前对其进行预排序
awk
的一个想法:
awk '
BEGIN { FS=OFS="t" } # input/output field delimiter is <TAB>
FNR==1 { lines[0]=lines[0] OFS FILENAME } # append filename to "header" record
FNR==NR { lines[FNR]=$1 } # save the "RowN" string
{ lines[FNR]=lines[FNR] OFS $3 } # append field #3 to the line
END { for (i=0;i<=FNR;i++) # loop through the line numbers ...
print lines[i] # printing each line to stdout
}
' *.txt
假设3个样本输入文件命名为{1..3}.txt
,则awk
脚本生成:
1.txt 2.txt 3.txt
Row1 389 31 6
Row2 906 0 21
Row3 3 5 45
Row4 976 12 765