使用文件和外部变量时 IF 语句不起作用

The IF statement is not working when working with a file and an external variable

我有 2 个文件,

文件 1:

YARRA2

文件 2:

59204.9493055556    
59205.5930555556

因此,文件 1 有 1 行,文件 2 有 2 行。如果file1有1行,file2不止1行,我想根据file2的行数重复file1的行。 所以,我的代码是这样的:

eprows=$(wc -l < file2)

awk '{ if( NR<2 && eprows>1 ) {print} {print}}' file1

但输出是

YARRA2

有什么想法吗?我也试过

awk '{ if( NR<2 && $eprows>1 ) {print} {print}}' file1

不过是一样的

您可以使用这个 awk 解决方案:

awk '
NR == FNR {
   ++n2
   next
}
{
   s = [=10=]
   print;
   ++n1
}
END {
   if (n1 == 1)
      for (n1=2; n1 <= n2; ++n1)
         print s
}' file2 file1

YARRA2
YARRA2
eprows=$(wc -l < file2)

awk '{ if( NR<2 && eprows>1 ) {print} {print}}' file1

糟糕!您使用混合语言 hip-deep。

eprows 变量是一个 shell 变量。除了通过环境之外,其他进程无法访问它,除非以某种方式显式传递。 awk 程序在 single-quotes 内,即使使用正确也会阻止解释 eprows

一个shell变量的值是用$得到的,所以

echo $eprows
2

将值插入 awk 脚本的一种方法是通过插值法:

awk '{ if( NR<2 && '"$eprows"'>1 ) {print} {print}}' file1

它使用了一个鲜为人知的技巧:只要不引入空格,就可以在单数和 double-quotes 之间切换。因为 shell 中的 double-quoted 字符串是内插的,awk 看到

{ if( NR<2 && 2>1 ) {print} {print} }

Awk 还允许您在命令行上将值传递给 awk 变量,因此:

awk -v eprows=$eprows '{ if( NR<2 && eprows >1 ) {print} {print}}' file1

但这样你会得到更好的 awk:

awk -v eprows=$eprows 'NR < 2 && eprows > 1 { {print} {print} }' file1

空白和简洁是清晰的灵丹妙药。

之所以有效,是因为在 awk pattern / action 范例中,pattern 是任何可以减少到 true/false。它不一定是正则表达式,尽管它通常是。

一个awk想法:

awk '
FNR==NR { cnt++; next }                    # count number of records in 1st file

                                           # no specific processing for 2nd file => just scan through to end of file

END     { if (FNR==1 && cnt >=2)           # if 2nd file has just 1 record (ie, FNR==1) and 1st file had 2+ records then ...
             for (i=1;i<=cnt;i++)          # for each record in 1st file ...
                 print                     # print current (and only) record from 2nd file
        }
' file2 file1

这会生成:

YARRA2
YARRA2