Problem
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
NOT Solution (exceeding memory limitation)
# Read from the file file.txt and print its transposed content to stdout.
cnt=$(sed '1q' file.txt | awk '{print NF}')
#or use `cnt=$(head -n1 file.txt | ...)` here.
for ((i=1;i<=$cnt;i=i+1))
do
echo $(cut -d ' ' -f $i file.txt)
done
According to above solution(exceeding memory limitation), we know that we cannot read the whole file in a time, we should read it and process it word by word, line by line.
solution(just like C)
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