Как я могу сделать все кроме первого нижнего регистра столбца?
как:
1 ONE
2 TWO TWO
3 THREE THREE THREE
требуемый вывод:
1 one
2 two two
3 three three three
Вы могли использовать нижний регистр GNU sed
\L
расширение:
sed -r 's/([^ \t]+\s)(.*)/\1\L\2/' file
-r
использование ДО s/old/new/
замена old
с new
([^ \t]+\s)
сохраняет некоторые символы, которые не являются пространством, или вкладка, сопровождаемая пространством или вкладкой (.*)
, сохраняет любое количество любых символов \1\L\2
, печатают первую сохраненную неизменную часть, затем вторая сохраненная часть печатала строчными литерами 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
Подход 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
Последний:
Только для забавы, другого подхода 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