IF语句在处理文件和外部变量时不起作用



我有两个文件,

file1:

YARRA2

file2:

59204.9493055556    
59205.5930555556

所以,file1有1行,file2有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 = $0
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

哦!你在混杂的语言中走得太远了。

eprows变量是shell变量。它不能被其他进程访问,除非通过环境,除非以某种方式显式传递。awk程序在单引号内,即使正确使用,也会阻止解释eprows

shell变量的值是通过$获得的,所以

echo $eprows
2
在awk脚本中插入值的一种方法是:
awk '{ if( NR<2 && '"$eprows"'>1 ) {print} {print}}' file1

使用了一个鲜为人知的技巧:你可以在单引号和双引号之间切换,只要你不引入空格。因为shell中的双引号字符串是内插的,所以awk看到

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

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

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

但你最好这样做:

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

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

之所以有效,是因为在awk模式/动作范例中,模式是任何可以简化为真/假的东西。它不一定是正则表达式,尽管通常是。

一个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

最新更新