0

这就是我要做的:显示作为参数给出的文件的内容,如下所示:位置 1、3、5、... 上的文件将正常显示。位置 2, 4, 6, ... 上的文件以相反的顺序打印每一行的单词(最后一个单词首先显示,倒数第二个显示,等等)。

我尝试了很多方法,但我不知道如何验证文件名在 awk 参数列表中的位置。

if(j%2!=0){
    for(i=1;i<=NF;i++)
            print $i
       }
else
    for(i=NF;i=1;i--)
            print $i
    }

这就是我可以从文件中打印行的方式。

BEGIN{
 for(j=1;j<ARGC;j++)
    a[j]=j
}

在这里,我尝试列出一个包含参数数量的列表。

但是我如何将列表与 if 一起使用?或者我怎样才能以不同的方式做到这一点?

$ awk -f 2.awk 1.txt 2.txt 3.txt

这是我使用的命令,其中 2.awk 是源文件。

文本文件示例:1.txt

1 2 3 4

a b c b
4

3 回答 3

1

使用 ARGIND 的 GNU awk:

gawk '!(ARGIND%2){for (i=NF;i>1;i--) printf "%s ",$i; print $1; next} 1' file1 file2 ...

与其他 awk 一起,只需通过在 FNR==1 块中增加一个变量来创建您自己的“ARGIND”,假设所有文件都不是空的。

于 2013-04-18T17:15:33.160 回答
0

好的,您可以根据需要进行按摩。这是一个 awk 可执行文件,您可以像这样运行:

awkex 1.txt 2.txt 3.txt

可执行的 awkex 文件的内容是:

awk '
BEGIN {
    for( i = 1; i < ARGC; i++ )
        {
        if( i % 2 == 0 ) { even_args[ ARGV[ i ] ] = ARGV[ i ]; }
        else { odd_args[ ARGV[ i ] ] = ARGV[ i ]; }
        }
    }
{
    if( odd_args[ FILENAME ] != "" )
        {
        for( i = 1; i <= NF; i++ )
            printf( "%s ", $i );
        printf( "\n" );
        }
    else
        {
        for( j = NF; j > 0; j-- )
            printf( "%s ", $j );
        printf( "\n" );
        }
}
' $*

假设每个 arg 都是一个文件名。奇数进入一张地图,偶数进入另一张地图。如果当前处理的 FILENAME 在奇数数组中,则做一件事,否则做另一件事。它还假设默认分隔符。您可以使用“awkex”文件中的 -F 标志来更改它。

于 2013-04-18T16:56:28.923 回答
0

这是使用 FNR 变量的最佳时机。如果 FNR==1 那么你在文件的第一行:

awk '
    FNR==1 {filenum++} 
    filenum%2==0 {
        # reverse the words of this line
        n = NF
        for (i=n; i>=1; i--) $(NF+1) = $i
        for (i=1; i<=n; i++) $i = $(n+i)
        NF = n
    } 
    1
' one two three four five six

测试:

# here's the contents of my files:
$ for f in one two three four five six ; do printf "%s: %s\n" $f "$(<$f)"; done
one: words in file one
two: words in file two
three: words in file three
four: words in file four
five: words in file five
six: words in file six

$ awk '                           
    FNR==1 {filenum++} 
    filenum%2==0 {
        n = NF
        for (i=n; i>=1; i--) $(NF+1) = $i
        for (i=1; i<=n; i++) $i = $(n+i)
        NF = n
    } 
    1
' one two three four five six

输出

words in file one
two file in words
words in file three
four file in words
words in file five
six file in words
于 2013-04-18T19:54:56.790 回答