Легко можно сделать с awk
awk '
/^!!/{ #for line stared with `!!`
getline <"file2.txt" #read 1 line from outer file into $0
}
1 #alias for `print $0`
' file1.txt
Другая версия
awk '
NR == FNR{ #for lines in first file
S[NR] = $0 #put line in array `S` with row number as index
next #starts script from the beginning
}
/^!!/{ #for line stared with `!!`
$0=S[++count] #replace line by corresponded array element
}
1 #alias for `print $0`
' file2.txt file1.txt
Аналогично моему недавнему ответу , но здесь нам нужно проверить, совпадает ли значение поля с 0.0
и подсчитать как столбец, так и строки в отдельный массив вместо суммирования -, поэтому:
awk '{
for (i=1; i<=NF; i++) {
if ($i=="0.0") { zero_in_column[i]+= 1 ; zero_in_row[NR]+= 1 }; }
}
END { for (X in zero_in_row)
print "in_row:"X, zero_in_row[X], "in_column:" X, zero_in_column[X]
}' OFS='\t' infile
Примечание:заменить массив zero_in_row
на zero_in_column
в END { for (X in zero_in_row)
, если число _в столбце _> число _в _строк.
для ввода, как показано ниже (, и у меня было END { for (X in zero_in_column)
, так как количество столбцов больше, чем количество строк):
1 0.0 3 0.0 4 0.0 0.0
3 4 5 0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0 0.0 0.0
Вывод:
in_row:1 4 in_column:1 1
in_row:2 4 in_column:2 2
in_row:3 7 in_column:3 1
in_row:4 in_column:4 3
in_row:5 in_column:5 2
in_row:6 in_column:6 3
in_row:7 in_column:7 3
Почему бы и нет (небольшая адаптация к предложению devWeek, не проверено):
awk '
{ROWCNT = 0
for (i=1; i<=NF; i++) if ($i == "0.0") {COLCNT[i]++
ROWCNT++
}
print "Row", NR,":", ROWCNT
}
END {for (i=1; i in COLCNT; i++) print "Col", i,":", COLCNT[i]
}
' file
сохранить порядок входных строк, так как порядок, в котором извлекаются элементы массива, не определен.