1

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

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

Name    Extension
Brian Aducci    6598
Jeff Alexander  6661
Sara Alfieri    6789

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

Name    Extension
BAducci 6598
JAlexander 6661
SAlfieri 6789
4

7 回答 7

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
于 2013-01-18T16:54:23.730 回答
0

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.

于 2013-01-18T16:52:32.827 回答
0

让我们假设它不是 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
于 2013-01-18T16:46:04.653 回答
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
于 2013-01-18T17:00:28.880 回答
0

有什么办法可以转换Brian AducciBAducci

它是名字的第一个字符和姓氏吗?如果是,那么下面应该可以工作:

{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
于 2013-01-18T16:46:37.327 回答
0

尝试这个

awk '{if( NR==1 ){print $1" "$2; next}}{a=substr($1,1,1); print a$2" "$3}' temp.txt

于 2013-01-18T16:50:18.727 回答
0

这与 Sudo_O 的解决方案基本相同sed。使用sed这种东西的麻烦在于,有许多版本sed根本不支持所使用的功能。(例如,-r是一个非标准选项,用于+在正则表达式中制作一个魔术字符。许多sed根本不提供对 的支持+

perl -pe 's/^(.)/\S*\s/$1/ if $. > 1' input-file
于 2013-01-18T20:49:29.407 回答