194.Transpose File
题目:
Given a text file file.txt, transpose its content.
You may assume that each row has the same number of columns and each field is separated by the ’ ’ character.
For example, if file.txt has the following content:
name age
alice 21
ryan 30
Output the following:
name alice ryan
age 21 30
题目含义:给定一个文件file.txt,转换文件的内容。假设文件内容每行有相同的元素,并且各元素之间由空格分隔。
解题思路:如果把文本的内容看成一个矩阵的话,这里的转换相当于求矩阵的转置。我们使用Linux命令awk,awk是一个强大的文本分析工具,并且awk是逐行处理文件,以空格为默认分隔符将每行分隔成小的元素,再进行各种分析处理。
使用方法:awk '{pattern + action}' {filenames}
,pattern是模式匹配的内容,action是匹配内容要执行的命令。
通过awk的内置变量NF可以知道文本内容列数,NR记录已读的列数,这样我们可以通过for循环把相同列的元素存入一个变量中,用空格分隔,最后再一行一行输出,这样就达到了变换文本内容的目的。
代码如下:
awk '{for(i=1;i<=NF;++i){
if(NR==1) s[i]=$i;
else s[i] = s[i] " " $i;
}
}END{
for(i=1;s[i]!="";++i){
print s[i];
}
}' file.txt
其中$i
表示当前行的第i
个元素。
执行流程:先读取文件,读入第一行数据,然后将记录按空格划分域,填充域,$0
则表示所有域, $1
表示第一个域,$n
表示第n个域,随后开始执行模式所对应的动作action,这里是for循环。接着开始读入第二行记录……直到所有的记录都读完并且执行完对应的action,最后再执行END操作。