如何将相同的awk操作应用于不同的文件?


8

我是awk的新手,我不知道是否可以编写执行此操作的awk脚本:

我有数百个必须排序的数据文件。对于每一个,我使用以下一线:

awk 'ORS=NR%3?" ":"\n" ' file1.tex >  file1_sorted.tex
awk 'ORS=NR%3?" ":"\n" ' file2.tex >  file2_sorted.tex
...

然后得到所需的输出。但是我想有一个脚本来自动执行此操作,获取每个文件,应用该操作并编写相应的排序文件。

多谢您的协助!

Answers:


7

如果您修改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==1BEGINFILE特殊模式。

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

谢谢@manatwork!这太棒了。与最后一个答案不同,我无法确切地知道这种单线工作方式,但确实如此。如果您有时间,我可以感谢您向我解释一下FNR==1。=)
Nacu 2012年

12

您可以在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}


1
“特定于外壳程序的语法”在POSIX中可用,并且实际上在每个仍在保修期内的UNIX系统上都可用,而许多不在保修范围内。
吉尔(Gilles)'所以

感谢@Arcege !,我将emacs用作shell。尽管您的建议是可以理解的,但我不知道该如何使用。据我了解并已经练习过,一个人编写了一个.awk脚本,该脚本在您想要将其应用到的文件或文件夹之前运行。我对吗?我这样做了,但是这似乎是另一种我不知道如何使用的脚本。
Nacu 2012年

您可以在emacs(<kbd> Mx </ kbd> shell)内运行一个shell ,并在提示符下运行上面的命令。或打开一个终端并在那里运行命令。有两种方法可以指定(awk,shell等)脚本:在命令行或在文件中。您awk在发布中的命令使用命令行形式;我的“一行”命令也是命令行形式。
Arcege

0

这是个老问题,但是考虑到我上次看到单核个人计算机是十年前,您可以使用gnu parallel

解决shell扩展和引号的解释

my_awk='ORS=NR%3?" ":"\n"' 

使用适当的glob来选择输入文件。在这里,我使用的{.} 是从输出名称中提取扩展名,因为之后会附加它

parallel -jX "awk '$my_awk' {} > {.}_sorted.tex" ::: *.tex

X您想使用的处理器数量在哪里,仍然可以使用1。这将为您file[1-9]_sorted.tex提供输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.