Bash:根据另一个文件中的行更改文件头[重复]

Posted

技术标签:

【中文标题】Bash:根据另一个文件中的行更改文件头[重复]【英文标题】:Bash: change header of file according to line in another file [duplicate] 【发布时间】:2016-07-23 17:11:06 【问题描述】:

我在文本文件 (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 就可以解决问题..

谢谢!

【问题讨论】:

【参考方案1】:
$ awk 'NR==FNRa[$1]=$2;next FNR==1for (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

【讨论】:

【参考方案2】:

下面是您的场景的简单 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
$

【讨论】:

阅读unix.stackexchange.com/questions/169716/… 了解为什么只使用shell 循环来操作文本总是错误的方法。 @EdMorton 谢谢 .. 会记住这一点

以上是关于Bash:根据另一个文件中的行更改文件头[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将文件中的行读入Bash数组[重复]

如何复制或删除bash中的特定行并将它们创建到新文件中[重复]

如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]

根据javascript中的文本行数更改textarea的高度[重复]

在文本文件中将纪元转换为标准的bash脚本[重复]

如何在bash中重复行并粘贴不同的列?