使用文件和外部变量时 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
我有 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