感觉很扯淡的一题,自己写的总是memory limit exceed或者time limit exceed
memory limit exceed
#!/bin/bash
cols=$(head -n 1 file.txt | wc -w) //统计有多少列
for((i=1; i<=$cols; i=i+1)){
line=$(cut -d ' ' -f ${i} file.txt)
res=""
for tmp in $line
do
res=${res}" "$tmp
done
echo ${res}
}
time limit exceed(如果只有一列,会造成死循环)
在只有一列的情况下:
cut -d ' ' -f 2 file.txt 取出来的其实是第一列
i=1
col=$(cut -d ' ' -f ${i} file.txt)
while [ "$col" != "" ]
do
line=""
for tmp in $col
do
line=${line}" "${tmp}
done
echo ${line}
i=$(($i+1))
col=$(cut -d ' ' -f ${i} file.txt)
done
改进后,不会time limit exceed,但是又会memory limit exceedi=1
col=$(cut -d ' ' -f ${i} file.txt)
while [ "$col" != "" ]
do
line=""
for tmp in $col
do
line=${line}" "${tmp}
done
echo ${line}
i=$(($i+1))
nextcol=$(cut -d ' ' -f ${i} file.txt)
[ "$nextcol" == "$col" ] && exit 0
col=${nextcol}
done
#!/bin/bash
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
awk居然还能这么用,END又是什么东西,还有相似的但貌似更完善的答案,关于awk的更多知识,可以参考:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
私房菜上讲的明显不够
awk '
{
for (i=1; i<=NF; i++) {
a[NR,i] = $i
}
}
NF>p { p = NF } //条件类型{动作},没有给p赋值,p应该为0
END {
for(j=1; j<=p; j++) {
str=a[1,j]
for(i=2; i<=NR; i++){
str=str" "a[i,j];
}
print str
}
}' file.txt
参考:http://bookshadow.com/weblog/2015/03/28/leetcode-transpose-file/
这个网站很多leetcode上的解答