Нижний регистр все кроме первого столбца

Как я могу сделать все кроме первого нижнего регистра столбца?

как:

1 ONE
2 TWO TWO
3 THREE THREE THREE

требуемый вывод:

1 one
2 two two
3 three three three
3
задан 11 April 2017 в 18:09

4 ответа

Вы могли использовать нижний регистр GNU sed \L расширение:

sed -r 's/([^ \t]+\s)(.*)/\1\L\2/' file

Объяснение

  • -r использование ДО
  • s/old/new/ замена old с new
  • ([^ \t]+\s) сохраняет некоторые символы, которые не являются пространством, или вкладка, сопровождаемая пространством или вкладкой
  • (.*), сохраняет любое количество любых символов
  • \1\L\2, печатают первую сохраненную неизменную часть, затем вторая сохраненная часть печатала строчными литерами
5
ответ дан 1 December 2019 в 13:01

awk с итерацией по всем кроме первого поля и преобразования строк к нижнему регистру с помощью tolower() функция:

awk '{out=""; for (i=2; i<=NF; i++) out=out" "tolower($i); print $1out}' file.txt
<час>

paste, cut, и sed, со справкой от замены процесса:

paste -d ' ' <(cut -d' ' -f1 file.txt) <(cut -d' ' -f2- file.txt | \
                                          sed -E 's/([[:upper:]])/\L\1/g')

Это имеет протест открытия файла дважды.

<час>

только с bash, с помощью расширения параметра для преобразования случаев:

while IFS=' ' read -r i j; do echo "${i} ${j,,}"; done <file.txt
<час>

Пример:

$ cat file.txt 
1 ONE
2 TWO TWO
3 THREE THREE THREE

$ awk '{out=""; for (i=2; i<=NF; i++) out=out" "tolower($i); print $1out}' file.txt 
1 one
2 two two
3 three three three

$ paste -d ' ' <(cut -d' ' -f1 file.txt) <(cut -d' ' -f2- file.txt | sed -E 's/([[:upper:]])/\L\1/g')
1 one
2 two two
3 three three three

$ while IFS=' ' read -r i j; do echo "${i} ${j,,}"; done <file.txt
1 one
2 two two
3 three three three
3
ответ дан 1 December 2019 в 13:01

Подход Perl с использованием lc() функция:

$ perl -lne 'print lc($_)' < input.txt                                                       
1 one
2 two two
3 three three three

Подход Python:

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])" < input.txt                
1 one
2 two two
3 three three three
  • отправьте входной файл как stdin к использованию команды Python < перенаправление оболочки
  • использование sys считайте все строки с помощью понимания списка ( l for l in list структура), при одновременном использовании .lower() метод
  • к получающемуся списку строк присоединяются в одну строку и распечатывают

Если Вы хотите удалить запаздывание новой строки, можно сделать так путем добавления единственной запятой в конце для Python 2 (который является значением по умолчанию для python команда):

$ python -c "import sys;print ''.join([l.lower() for l in sys.stdin])," < input.txt

Для Python 3 функция печати отличается, и это имеет другой способ разделить запаздывание новой строки - через end ключевое слово:

$ python3 -c "import sys;print(''.join([l.lower() for l in sys.stdin]),end='')" < input.txt 

Предыдущие подходы предполагают, что первый столбец является числовым как в примере OP. Для универсального подхода, где мы хотим только, чтобы непервые столбцы были преобразованы, мы можем сделать это в жемчуге:

$ cat input.txt
1 ONE
SOMETHING TWO TWO
$!@# THREE THREE THREE

$ perl -ane 'print $F[0]; print map { " " . lc($_)} @F[1..$#F];print "\n"' < input.txt        
1 one
SOMETHING two two
$!@# three three three

В Python ради удобочитаемости мы можем сделать сценарий:

#!/usr/bin/env python
import sys
for line in sys.stdin:
    words = line.strip().split()
    case_words = [ word.lower() for word in words[1:]   ]
    print( " ".join([words[0]]+case_words)  )

Который работает как так с тем же входом как в примере жемчуга:

$ ./lowercase_columns.py < input.txt
1 one
SOMETHING two two
$!@# three three three
3
ответ дан 1 December 2019 в 13:01

Последний:

Только для забавы, другого подхода Python:

python3 -c "for l in open('f'): l = l.split(' ',1); print(l[0], l[1].strip().lower())"

Где 'f' файл, между кавычками.

Этот подход предполагает, что файл не имеет пустых строк.

Объяснение

  • Каждая из строк сначала разделяется на первом вхождении разделителя.

    l = l.split(' ',1)
    
  • Впоследствии, вторая часть (все столбцы, но первое) понижена:

    l[1].strip().lower()
    
  • и объединенный результат печатается:

    print(l[0], l[1].strip().lower())
    

Пример производится

На файле:

EEN AAP OP EEN FIETS
2 EEn banaan IS LEKKER
MIJN tante in Marokko
1 ONE
2 TWO TWO
3 THREE THREE THREE

Вывод:

EEN aap op een fiets
2 een banaan is lekker
MIJN tante in marokko
1 one
2 two two
3 three three three
2
ответ дан 1 December 2019 в 13:01

Другие вопросы по тегам:

Похожие вопросы: