Bash:根据另一个文件中的行更改文件头

时间:2016-04-04 08:37:18

标签: linux bash awk header

我在文本文件(dataframe.txt)中有一个数据集,文件的标题是数字中的变量名。数字的含义(变量的实际名称)存储在另一个文件(variables.txt)中。例如(为简单起见编辑:

> head dataframe.txt 
123 456 789
1    2   3
4    5   6
7    8   9

> variables.txt
123 A
456 B
789 C

我想将dataframe.txt的标题更改为存储在variables.txt文件中的名称。数字和名称之间的联系需要保持不变。所需的输出是:

> head dataframe.txt 
A    B   C
1    2   3
4    5   6
7    8   9

有没有办法根据另一个将数字与名称相关联的文件来更改标题?我可以想象,几行awk可以做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是适用于您的方案的简单bash脚本:

文件名:script.bash

#!/bin/bash
while read -r line || [[ -n "$line" ]]; do
    sed -i -r '1s/\b'"$(awk '{print $1}' <<< "$line")"'\b/'"$(awk '{print $2}' <<< "$line")"'/g' dataframe.txt
done < variables.txt

输出:

$ cat dataframe.txt 
123 456 789
1    2   3
4    5   6
7    8   9
force@force-virtual-machine:~/temp2$ cat variables.txt 
123 A
456 B
789 C
$ ./script.bash 
$ cat dataframe.txt 
A B C
1    2   3
4    5   6
7    8   9
$

答案 1 :(得分:1)

$ awk 'NR==FNR{a[$1]=$2;next} FNR==1{for (i=1;i<=NF;i++) $i=a[$i]} 1' variables.txt dataframe.txt | column -t
A  B  C
1  2  3
4  5  6
7  8  9