从unix中的文本文件中删除数字字符串

时间:2014-08-10 00:30:28

标签: unix awk grep

我有一个文件,其中包含姓名和电话号码列表,如下所示:

Smith,John 315-555-1212
Jones,Graham 315-234-2344
Aikman,Troy 312-153-3232
Young,Steve 415-343-3421

我需要一个命令字符串,它只输出带有“315”区号的行,输出没有区号的行,并根据姓氏排序。我希望输出看起来像这样:

琼斯,格雷厄姆234-2344

史密斯,约翰555-1212

到目前为止,我有这个用于获取列表。 “areacode”是我的文件的名称。如何打印已排序的名称列表并从输出中的名称列表中删除区号?

awk '$2~/315/ { print }' areacode

5 个答案:

答案 0 :(得分:0)

grep  ' 315-' areacode |  awk  '{ sub(/315-/ ,"" ); print $0}' | sort -t, -k1 > newfile

首先尝试一下,假设我得到了你的要求。这个(除了排序)也在awk中完成。

awk '/315-'/ { sub(/315-/ ,"" ); print $0 } ' areacode | sort -t, -k1 > newfile

答案 1 :(得分:0)

这是一种方法:

awk '/ 315-/ {sub(/315-/ ,"");print|sort}' sort="sort -t, -k1" areacode 
Jones,Graham 234-2344
Smith,John 555-1212

答案 2 :(得分:0)

尝试如下...您可以传递您正在搜索的areacode参数...

 awk '$2 ~ "^"areacode {split($2,a,"-"); print $1" "a[2]"-"a[3]}' areacode=315 myfile.txt | sort -t, -k2

传递区域315时的样本输出

Jones,Graham 234-2344
Smith,John 555-1212

答案 3 :(得分:0)

使用GNU awk:

awk -F'[ ,-]' '$3==315 { a[$2]=$1 } END { n=asorti(a,b); for(i=1;i<=n;++i) print b[i],a[b[i]] }' file

将行拆分为空格,逗号或连字符的字段。填充数组a,其键是姓氏,值是forenames。处理完文件后,对数组键进行排序并循环遍历排序的数组。

使用awk并排序:

awk -F'[ ,-]' '$3==315 { print $2,$1 }' file | sort -k2

打印姓氏后跟姓氏,并按姓氏的字母顺序排序。

输出,使用任何一种方法:

Graham Jones
John Smith

如果你想保留原来的姓氏,姓氏和#34;格式,您可以改为使用(GNU awk):

awk -F'[ ,]' 'BEGIN { OFS="," } $3 ~ /^315/ { a[$2]=$1 } END { n=asorti(a,b); for(i=1;i<=n;++i) print a[b[i]],b[i] }' file

或者:

awk '$2 ~ /^315/ { print $1 }' file | sort -t, -k1

输出:

Jones,Graham
Smith,John

答案 4 :(得分:0)

$ sort -t, -k2 file | awk -v area="315" 'sub("^"area"-","",$2)'
Jones,Graham 234-2344
Smith,John 555-1212

或者如果您只想要名字:

$ sort -t, -k2 file | awk -v area="315" '$2 ~ "^"area{print $1}'
Jones,Graham
Smith,John