需要帮助修复与awk和sed的CSV文件,而不是黑客攻击

时间:2013-01-18 16:37:54

标签: bash csv awk sed

我搜索过堆栈,但我遇到了特定的CSV文件:

我有一个大的CSV文件格式为两列:

Name    Extension
Brian Aducci    6598
Jeff Alexander  6661
Sara Alfieri    6789

我想保留扩展名并将名称修改为用户名:

Name    Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789

7 个答案:

答案 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