我必须从这个数据 - test1.txt:
1 - Billing_Type
604 - Customer_Name
2 - Contact_Name
3 - Customer_Phone_Number
4 - Contact_Phone_Number
5 - Customer_Type
6 - Reason_Code
7 - CALLE 1
8 - CALLE 2
9 - NUMERO
10 - ID
11 - Service Address
1700001031 - Serial_Number
1700001008 - STB_REF_AP_ID
1700001027 - Smart_Card_ID
我正在比较文件的第一部分例如 1700001031
,1
,8
等来自文件的循环然后复制第二部分变量中的文件,如Serial_Number
,Billing_Type
,CALLE 2
。
这是我用过的陈述: 样本陈述
grep -w 1 test1.txt | cut -d'-' -f2 |tr -d ' '
但是这个陈述的问题是,对于值1和2,将输出两行。 对于1作为ID,它将打印:
Billing_Type
CALLE 1
因为ATTR_NAME在“CALLE 1”中也包含单词值1。
我如何仅在第一部分进行搜索并在不制作任何额外文件的情况下获得第二部分?
答案 0 :(得分:4)
您真的想要使用awk
而不是grep
:
$ awk -F' - ' '$1==1{print $2}' file
Billing_Type
$ awk -F' - ' '$1==7{print $2}' file
CALLE 1
$ awk -F' - ' '$1==1700001031{print $2}' file
Serial_Number
这对第一个字段$1
进行数字相等性测试,如果该行匹配,则使用$2
作为字段分隔符打印第二个字段-
。
使用GNU Grep
您可以执行以下操作,但awk
方法肯定是要走的路:
$ grep -Po '^1\s+-\s+\K.*' file
Billing_Type
$ grep -Po '^7\s+-\s+\K.*' file
CALLE 1
$ grep -Po '^1700001031\s+-\s+\K.*' file
Serial_Number
这匹配字符串^
的字符串的开头,然后是给定的数字,后跟一个或多个空格,短划线和更多空格\s+-\s+
,\K
是perl兼容常规的一部分表达式所以不要指望它被广泛使用,它的作用是让所有以前匹配的字符串部分被遗忘。最后,我们匹配行.*
的其余部分,并且只有-o
选项和\K
打印才能打印。
使用sed
的方法是匹配该行,然后用空字符串替换该行的开头:
$ sed -rn '/^1\s/{s/^[0-9]+\s+-\s+//p}' file
Billing_Type
$ sed -rn '/^7\s/{s/^[0-9]+\s+-\s+//p}' file
CALLE 1
$ sed -rn '/^1700001031\s/{s/^[0-9]+\s+-\s+//p}' file
Serial_Number
答案 1 :(得分:1)
您只需要在搜索ID号之前添加^
到您的命令
grep -w '^1' test1.txt | cut -d'-' -f2 |tr -d ' '