将不同文件的每三列添加到一个文件中



我是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.txt12.txt3.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

最新更新