![除第一列外,其余列均小写](https://linux22.com/image/1089533/%E9%99%A4%E7%AC%AC%E4%B8%80%E5%88%97%E5%A4%96%EF%BC%8C%E5%85%B6%E4%BD%99%E5%88%97%E5%9D%87%E5%B0%8F%E5%86%99.png)
我怎样才能将除第一列之外的所有列都变为小写?
喜欢:
1 ONE
2 TWO TWO
3 THREE THREE THREE
所需输出:
1 one
2 two two
3 three three three
答案1
您可以使用 GNUsed
的小写\L
扩展:
sed -r 's/([^ \t]+\s)(.*)/\1\L\2/' file
解释
-r
使用 EREs/old/new/
old
用。。。来代替new
([^ \t]+\s)
保存一些不是空格或制表符的字符,后跟一个空格或制表符(.*)
保存任意数量的任意字符\1\L\2
打印第一个保存的部分,不做任何修改,然后打印第二个保存的部分,并将其小写
答案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
答案3
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
- 使用shell 重定向将输入文件作为
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,print 函数有所不同,并且它具有不同的删除尾随换行符的方式 - 通过end
关键字:
$ python3 -c "import sys;print(''.join([l.lower() for l in sys.stdin]),end='')" < input.txt
以前的方法假设第一列是数字,如 OP 的示例所示。对于我们只想转换非第一列的通用方法,我们可以在 perl 中执行此操作:
$ 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) )
其工作原理与 perl 示例中的输入相同:
$ ./lowercase_columns.py < input.txt
1 one
SOMETHING two two
$!@# three three three
答案4
迟来的:
只是为了好玩,另一种 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