Awk反转行和字

Awk反转行和字,awk,reverse,Awk,Reverse,我不熟悉编程语言和其他东西 所以我必须用awk反转所有的行,以及这些行中的所有单词,从一个文件中打印出来 要反转的“文件1”: aa bb cc 福多阿斯 “文件1”的输出打印应如下所示: 福也是 cc bb aa 我在每行中都尝试了“反向”一词: 用于(i=NF;i>1;i--)printf(“%s”,$i);printf(“%s\n”,$1) 但是如果我想打印相反的行,我必须这样做 {a[NR]=$0 }END{for(i=NR; i; i--) print a[i]} 我需要在终端中使

我不熟悉编程语言和其他东西 所以我必须用awk反转所有的行,以及这些行中的所有单词,从一个文件中打印出来

要反转的“文件1”:

aa bb cc

福多阿斯

“文件1”的输出打印应如下所示:

福也是

cc bb aa

我在每行中都尝试了“反向”一词:

用于(i=NF;i>1;i--)printf(“%s”,$i);printf(“%s\n”,$1)

但是如果我想打印相反的行,我必须这样做

{a[NR]=$0
}END{for(i=NR; i; i--) print a[i]}
我需要在终端中使用此命令处理两个文件:

awk -f commandFile FileToBePrinted
问题是我开始参与这一切,我不知道如何将这两者结合起来。 谢谢

用于反转文件的行,然后使用awk反转单词

tac filename | awk '{for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)}'
您还可以使用类似Perl的内置列表反转功能:

tac filename | perl -lane 'print join(" ", reverse(@F))'

Kev的解决方案是将每个单词中的文本颠倒过来。您的示例输出没有显示这一点,但他的关键点是使用函数

你有你需要的代码,你只需要重新排列一下

cat file1
aa bb cc
foo do as

cat commandFile

function reverse( line ) {
  n=split(line, tmpLine)
  for (j=n; j>0; j--) {
    printf("%s ",tmpLine[j] )
  }

}
# main loop
{ a[NR]=$0 }

# print reversed array
END{ for(i=NR; i>0; i--) printf( "%s\n",  reverse(a[i]) ) }
运行

 awk -f commandFile file1
输出

as do foo
cc bb aa
我用
n=split(line,tmpLine)…做了一些小改动。。。print tmpLine[j]
,是解析函数中输入行以将其打印出来的常用方法。我认为$1变量没有从数组传入的值(您的a[I]值)的作用域,所以我将其更改为split..tmpLine[j]。我还发现END部分的'I'变量保留在函数
reverse
的作用域中,因此我将其更改为j以消除歧义


我必须弄清楚一些事情,下面是我使用的调试版本

如果您要访问gawk,那么最好学习如何使用可用的调试器。如果您在没有调试器的系统上使用awk/gawk/nawk,那么这是了解代码中发生了什么的一种方法。如果将程序输出重定向到文件或管道,并且系统支持“/dev/stderr”符号,则可以在那里打印调试行,即

 #dbg print "#dbg0:line=" line > "/dev/stderr"
有些系统有其他用于访问stderr的符号,所以如果您要做这么多,那么有必要找出可用的符号

cat commandFile.debug
function reverse( line ) {
  n=split(line, tmpLine)
  #dbg print "#dbg0:line=" line
  #dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j]
  for (j=n; j>0; j--) {
    #dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j]
    printf("%s ",tmpLine[j] )
  }

}
# main loop
{ a[NR]=$0 }

# print reversed array
#dbg END{ print "AT END";  for(i=NR; i>0; i--) printf( "#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i])
 ) }
END{ for(i=NR; i>0; i--) printf( "%s\n",  reverse(a[i]) ) }

我希望这能有所帮助。

+1对于提出得好的问题(也是第一次!)。良好的格式,样本输入,样本输出和代码是不工作的!好节目,继续发帖!
cat commandFile.debug
function reverse( line ) {
  n=split(line, tmpLine)
  #dbg print "#dbg0:line=" line
  #dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j]
  for (j=n; j>0; j--) {
    #dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j]
    printf("%s ",tmpLine[j] )
  }

}
# main loop
{ a[NR]=$0 }

# print reversed array
#dbg END{ print "AT END";  for(i=NR; i>0; i--) printf( "#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i])
 ) }
END{ for(i=NR; i>0; i--) printf( "%s\n",  reverse(a[i]) ) }