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中的特定行并将它们创建到新文件中[重复]
如何使用for循环将文本文件中的一行字符串作为Bash中另一个脚本的单独变量传递[重复]