gpt4 book ai didi

awk 反转行和单词

转载 作者:行者123 更新时间:2023-12-04 11:56:54 27 4
gpt4 key购买 nike

我是编程语言和东西的新手
所以我必须用 awk 反转文件中的所有行以及这些行中的所有单词并将它们打印出来。

“File1”反转:

aa bb cc

foo do as



“File1”的输出打印应该是这样的:

as do foo

cc bb aa



我在每一行中为 word reverse 尝试了这个:
for (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

问题是我是这一切的初学者,我不知道如何将这两者结合起来。
谢谢!

最佳答案

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]) ) }

我希望这有帮助。

关于awk 反转行和单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9891286/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com