Удалите слова (буквы, за которыми следует пробел) из определенного столбца

У меня есть файл и формат выглядит следующим образом:

cat dog AHF123432 | 123432 | dhfshfjdh lion AFG23412 |23412 | dfshjhfjdhj 

Мне нужно удалить эти слова из первого столбца, который содержит только алфавиты, т.е. cat (за которым следует пробел) и собака из первой строки и лев из второй строки

Мой вывод будет выглядеть примерно так:

 AHF123432 | 123432 | dhfshfjdh AFG23412 | 23412 | dhfshfjdh 

Может ли кто-нибудь помочь мне в этом вопросе? Заранее спасибо

Это удаляет все чисто-алфавитные слова с начала строки:

 $ sed -r 's/^([[:alpha:]]* )*//' filename.tsv AHF123432 | 123432 | dhfshfjdh AFG23412 |23412 | dfshjhfjdhj 

Или, чтобы сохранить вывод в новом файле:

 sed -r 's/^([[:alpha:]]* )*//' filename.tsv > final.tsv 

Как это работает

  • [[:alpha:]]* соответствует любому количеству буквенных символов, за которыми следует пробел. Другими словами, он соответствует слову, а затем пробелу.

    Более подробно, [[:alpha:]] соответствует одному символу алфавита. “ [[: alpha:]] * `соответствует любому числу таких символов.

  • ([[:alpha:]]* )* соответствует любому числу таких слов, за которыми следуют пробелы.

  • ^([[:alpha:]]* )* соответствует любому количеству слов, за которыми следуют пробелы, но из-за ^ , только начиная с начала строки.

  • Команда substitute удаляет все соответствующие слова. Команда substitute имеет форму s/old/new/ where, здесь old – это наше выражение, которое соответствует любому количеству слов, начинающихся с начала строки. Мы хотим заменить эти слова ничем, поэтому мы используем пустую строку для new .

В старые времена регулярное выражение, соответствующее алфавитным символам, было [a-zA-Z] . С современными юникодными шрифтами, которые теперь более надежны. Поскольку наше регулярное выражение выше использует [:alpha:] , оно безопасно для Unicode.

Если ваш grep поддерживает p eble c ompatible r egular e xpressions:

 grep -Po '^([az]* +)*\K.*' 

или

 pcregrep -o '^([az]* +)*\K.*' 

Использование awk

 awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([az]|[AZ])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo 

пример

 % cat foo cat dog AHF123432 | 123432 | dhfshfjdh lion AFG23412 | 23412 | dfshjhfjdh % awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([az]|[AZ])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo AHF123432 | 123432 | dhfshfjdh AFG23412 | 23412 | dfshjhfjdh