我搜索了堆栈,但遇到了一个特定的 CSV 文件:
我有一个大的 CSV 文件,格式分为两列:
Name Extension
Brian Aducci 6598
Jeff Alexander 6661
Sara Alfieri 6789
我想保留扩展名并将名称修剪为用户名:
Name Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
这条短线应该给你你想要的:
awk 'NR>1{$0=substr($1,0,1)$2" "$3}1' file
测试
kent$ echo "Name Extension
Brian Aducci 6598
Jeff Alexander 6661
Sara Alfieri 6789"|awk 'NR>1{$0=substr($1,0,1)$2" "$3}1'
Name Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
awk would be my choice
awk 'NF>2{ for (i=1;i<NF -1;i++){ initials=initials substr($i,0,1) }; print initials $(NF-1), $NF}' x.txt
which checks the number of fields (NF) is greater than 2 then loops over fields 1 - NF-1 then takes the first letter of each and puts it into the initials variable. Then we print out the initials the last name and the extension.
让我们假设它不是 2,而是“至少 3”列... fisname lastname extension
也许有超过 1 个名字(这种情况经常发生)
让我们假设:登录是第一列的第一个字符,+第 n-1 列(=名称)
你会这样做:
gawk '(NR == 1) { print ; next ;} /./ { name=NF-1 ; print substr($1,1,1) $name " " $NF }' /the/file
如果你有这将工作
Name Extension
firstname1 lastname1 extension1
firstname2a firsntname2b lastname2 extension2
...
(即无论有多少个名字,1 个或多个)(但是有多少空格或制表符分隔每个字段)
该(NR == 1) { print ; next ; }
部分是“按原样”打印第一(标题)行,然后“下一个”打印到其他行。如果你没有标题,你可以把它拿出来。
在其他行上,NR>1,所以只有第二个模式(/./
,意思是“如果行不为空”)适用,它会打印你需要的内容(如果有奇怪的名字,比如:john john name1 name2,请更改它,但是应该很少见)
您还可以使用 gnu awk (或 nawk) 'tolower' 强制某些内容为小写:
gawk '(NR == 1) { print ; next ;} /./ { name=NF-1 ; print tolower(substr($1,1,1)) tolower($name) " " $NF }' /the/file
这实际上更容易sed
:
$ cat file
Name Extension
Brian Aducci 6598
Jeff Alexander 6661
Sara Alfieri 6789
$ sed -r '2,$s/(.)\w+\s+/\1/' file
Name Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
一种方法awk
:
$ awk 'NR>1{sub(/\w+\s+/,substr($0,1,1),$0)}1' file
Name Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
有什么办法可以转换Brian Aducci
成BAducci
?
它是名字的第一个字符和姓氏吗?如果是,那么下面应该可以工作:
{read x; echo $x; while read x y; do echo ${x:0:1}$y; done; } <large_file >output_file
sed 方法:
sed -r '1!s/^(.)[^ ]* */\1/' large_file >output_file
尝试这个
awk '{if( NR==1 ){print $1" "$2; next}}{a=substr($1,1,1); print a$2" "$3}' temp.txt
这与 Sudo_O 的解决方案基本相同sed
。使用sed
这种东西的麻烦在于,有许多版本sed
根本不支持所使用的功能。(例如,-r
是一个非标准选项,用于+
在正则表达式中制作一个魔术字符。许多sed
根本不提供对 的支持+
)
perl -pe 's/^(.)/\S*\s/$1/ if $. > 1' input-file