除第一列外,其余列均小写

除第一列外,其余列均小写

我怎样才能将除第一列之外的所有列都变为小写?

喜欢:

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使用 ERE
  • s/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,,cutsed,借助过程替代:

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 重定向将输入文件作为stdinpython 命令发送<
  • 使用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

相关内容