题目

  1. 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.

Example:

If file.txt has the following content:

name age
alice 21
ryan 30

Output the following:

name alice ryan
age 21 30

解法1

awk -F ' ' '
BEGIN { ORS=""; i=0; nf=1;}; 

{ 
    { for(line=1; line<=NF; line++)
        { N[FNR][line] = $line; nf=NF;}; i++
    } 
}; 

END { for(itnf=1; itnf<=nf; itnf++)
        { for(it=1;it<=i;it++) {
            print N[it][itnf]; 
            { if(it != i) print " "; } 
        }; 
        print "\n"; 
        }
}' file.txt
  • BEGIN { ORS=""; }: 每次输出后不必自动换行, 直接连着输出下一个。(这题中输出空格和换行由我们自己控制。)
ORS The output record separator, by default a newline.
  • i为行号,自然从0开始计数。
  • NR: 当前行号(current line number),但是会在多个文件之间被累计。
  • FNR: 当前文件的行号。
  • NF: 当前行中字段的总数。
  • 但是这题中我们的二维数组N两个维度的角标都从1开始
  • 思路就是使用一个二维数组用行的方式去存储,但是用列的方式去输出。(即Transpose这词的意思。)

解法2

awk '
{
    for (i = 1; i <= NF; i++) {
        if (FNR == 1) {
            t[i] = $i;
        } else {
            t[i] = t[i] " " $i
        }
    }
}

END {
    for (i = 1; t[i] != ""; i++) {
        print t[i]
    }
}
' file.txt
  • 思路类似,但是没有用二位数组。
  • t[i] = t[i] " " $i: 而是对源文件中每一行中的字段以此并入(append)数组的每一个位置。

引用和推荐阅读:

https://leetcode.com/problems...

https://leetcode.com/problems...

https://stackoverflow.com/a/2...

https://www.grymoire.com/Unix...

该文章遵循创作共用版权协议 CC BY-NC 4.0,要求署名、非商业 、保持一致。在满足创作共用版权协议 CC BY-NC 4.0 的基础上可以转载,但请以超链接形式注明出处。文章仅代表作者的知识和看法,如有不同观点,可以回复并讨论。


罗济高
1 声望1 粉丝