У меня есть файл со следующим данных-gsub много столбцов одновременно на основе разных условий gsub?
INPUT-
A B C D E F
A B B B B B
C A C D E F
A B D E F A
A A A A A F
A B C B B B
Если какой-либо из других строк, начиная со строки 2, имеют ту же букву, как строки 1, они должны быть изменены до 1. В принципе , Я пытаюсь выяснить, насколько сходна любая из строк в первой строке.
Желаемая output-
1 1 1 1 1 1
1 1 B B B B
C A 1 1 1 1
1 1 D E F A
1 A A A A 1
1 1 1 B B B
Первая строка становится все 1, так как оно идентично себе (очевидно). Во втором ряду первый и второй столбцы идентичны первой строке (A B
) и, следовательно, они становятся 1 1
. И так далее для других строк.
Я написал следующий код, который делает это transformation-
for seq in {1..1} ; #Iterate over the rows (in this case just row 1)
do
for position in {1..6} ; #Iterate over the columns
do
#Define the letter in the first row with which I'm comparing the rest of the rows
aa=$(awk -v pos=$position -v line=$seq 'NR == line {print $pos}' f)
#If it matches, gsub it to 1
awk -v var=$aa -v pos=$position '{gsub (var, "1", $pos)} 1' f > temp
#Save this intermediate file and now act on this
mv temp f
done
done
Как вы можете себе представить, что это очень медленно, потому что вложенный цикл дорого. Мои реальные данные - это матрица 60x10000, и для этой программы требуется около 2 часов.
Я надеялся, что вы сможете помочь мне избавиться от внутреннего цикла, чтобы я мог делать все 6 gsubs за один шаг. Может быть, это их собственный массив? Мои навыки awk
еще невелики.
Пожалуйста, обратите внимание на: [Что я должен делать, когда кто-то ответит на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – Cyrus