Answers:
如果您修改awk
代码,则可以通过单个awk
过程解决,而无需任何shell循环:
awk 'FNR==1{if(o)close(o);o=FILENAME;sub(/\.tex/,"_sorted.tex",o)}{ORS=FNR%3?" ":"\n";print>o}' *.tex
不是美女,只是微不足道。
注释中要求的解释。
FNR
(˚F ILE ñ棕土或- [R的eCord)类似于NR
(ñ棕土或- [R的eCord),但同时NR
是所有输入记录的连续的序列号,FNR
被复位为1,开始一个新的输入文件的处理时。
一gawk
对4.0唯一的选择FNR==1
是BEGINFILE
特殊模式。
awk '
FNR==1{ # first record of an input file?
if(o)close(o); # was previous output file? close it
o=FILENAME;sub(/\.tex/,"_sorted.tex",o) # new output file name
}
{
ORS=FNR%3?" ":"\n"; # set ORS based on FNR (not NR as in the original code)
print>o # print to the current output file
}
' *.tex
您可以在for循环中应用文件:
for file in *.tex;
do
awk 'ORS=NR%3?" ":"\n"' "$file" > "$(basename "$file")_sorted.tex"
done
或一行:
for file in *.tex; do awk 'ORS=NR%3?" ":"\n"' $file > "$(basename "$file" .tex)_sorted.tex"; done
由于您未指定哪个外壳,因此请使用更标准的外壳,basename
而不要使用特定于外壳的语法${file%%.tex}
。
shell
)内运行一个shell ,并在提示符下运行上面的命令。或打开一个终端并在那里运行命令。有两种方法可以指定(awk,shell等)脚本:在命令行或在文件中。您awk
在发布中的命令使用命令行形式;我的“一行”命令也是命令行形式。
FNR==1
。=)