我有两个文件,
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