我有2個檔案,
檔案1:
YARRA2
檔案2:
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
但它是一樣的
uj5u.com熱心網友回復:
您可以使用此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
uj5u.com熱心網友回復:
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 :
awk -v eprows=$eprows 'NR < 2 && eprows > 1 { {print} {print} }' file1
空白和簡潔是清晰的靈丹妙藥。
這是有效的,因為在 awk模式/動作范例中,模式是可以簡化為真/假的任何東西。它不必是正則運算式,盡管它通常是。
uj5u.com熱心網友回復:
一個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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/487581.html
下一篇:陣列不起作用的“如果陳述句”
