awk определенно твой друг.
awk читает файл данных построчно. Вам не нужно / не нужно иметь какую-либо структуру цикла (если вы не очень продвинулись).
awk '{print $0}' inFile
Это все, что вам нужно, чтобы прочитать каждую строку файла и распечатать его (он попадет на ваш экран, поэтому не делайте большой файл)
обратите внимание, что я использовал $0
для обозначения «всей строки данных».
В Awk также есть переменные для ссылки на каждое поле данных, вы используете такие значения, как $2
, чтобы напечатать второе поле в файле.
Я хочу заменить цифры на буквы в соответствии со столбцами 5 и 6. Итак, я хочу заменить 0 на TT (если 5-й столбец - T) и 2 на CC (если 6-й столбец - C) и 1 на TC (если 5-й и 6-й столбцы - T и C соответственно), и я хочу изменить -1 на? ? или же ! !
Итак, для вашей проблемы вы хотите проверить каждую строку, проверить определенные поля и установить новые значения.
awk 'NR>1{
# replace 0 with T T (if the 5th column is T)
if ($5 == 0) $5="TT"
# and 2 by C C (if the 6th column is C)
if ($6 == 2) $6="CC"
# and 1 with T C (if the 5th and 6th columns are T and C respectively)
if ($5 == "T" && $6 == "C") $1="1"
}' inputFile | sed 's/TT/T T/; s/CC/C C/'
Чтобы изменить все поля после определенного поля, включите этот код при необходимости,
awk 'NR>1{
# replace 0 with T T (if the 5th column is T)
if ($5 == 0) {
for (i=5; i<=NF;i++) {
printf("T ")
}
printf("\n")
}
......
} 'inputfile ...
NR>1
означает, что обрабатываются только номера строк больше 1.
Обратите внимание, что мы используем простую логику для улучшения ваших тестов. легко добавить еще и еще. Напомним, что много раз имеет смысл использовать «многоуровневую» логику if ($5==0) { ... } else if ($5 == 1) { ....}
Одна проблема - это, например, ваше требование вывести «C C». Когда вы делаете что-то вроде `$ 5 =" C C "в awk, awk перекалибрует номера полей, поэтому $ 5 будет C, а $ 6 будет C, а не значением, которое было там раньше.
Я взял короткий путь печати 'CC', а затем использовал sed в конце, чтобы создать значения 'C C', которые указывает ваша спецификация.
Я не уверен, что делать с
и я хочу изменить -1 на? ? или же ! !
так как это должно быть одно или другое, и я не уверен, с каким полем вы хотите работать. Используйте приведенный выше код в качестве руководства. Если вы застряли, опубликуйте новый вопрос с примерами входных данных, ожидаемым результатом, текущим результатом и используемым кодом.
Надеюсь, это поможет.