我搜索过堆栈,但我遇到了特定的CSV文件:
我有一个大的CSV文件格式为两列:
Name Extension
Brian Aducci 6598
Jeff Alexander 6661
Sara Alfieri 6789
我想保留扩展名并将名称修改为用户名:
Name Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
答案 0 :(得分:1)
这条短线应该能给你你想要的东西:
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
答案 1 :(得分:0)
让我们假设它不是2,而是“至少3”列... firsname lastname extension
也许有超过1个名字(这种情况会发生很多)
我们假设:登录是第1列的第一个字符,+第n列(=名称)
你会这样做: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
...
(即无论有多少个名字,一个或多个)(无论多少个空格或标签分隔每个字段)
(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
答案 2 :(得分:0)
将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
答案 3 :(得分:0)
试试这个
awk '{if( NR==1 ){print $1" "$2; next}}{a=substr($1,1,1); print a$2" "$3}' temp.txt
答案 4 :(得分:0)
awk将是我的选择
awk 'NF>2{ for (i=1;i<NF -1;i++){ initials=initials substr($i,0,1) }; print initials $(NF-1), $NF}' x.txt
检查字段数(NF)是否大于2 然后循环遍历字段1 - NF-1 然后取每个字母的第一个字母并将其放入initials变量中。 然后我们打印出姓氏和扩展名的首字母。
答案 5 :(得分:0)
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
答案 6 :(得分:0)
这与Sudo_O的sed
解决方案基本相同。使用sed
进行此类操作的问题在于,sed
的许多版本都不支持所使用的功能。 (例如,-r
是一个非标准选项,用于使+
成为正则表达式中的魔术角色。许多sed
根本不支持+
)< / p>
perl -pe 's/^(.)/\S*\s/$1/ if $. > 1' input-file