Chinaunix

标题: 用sed或awk如何实现 [打印本页]

作者: xiaoshichao143    时间: 2015-04-14 14:42
标题: 用sed或awk如何实现
  1. ------------------------------------------------
  2. sLanguage|sServiceID|nSPID|nServiceCode|sMemo|sLangTypeAbbr|sUsed|nSMSCodeSchema|sNBLangID
  3. ------------------------------------------------
  4. 142|-1|-1|1|Chinese|cn|1|1|01
  5. 01|-1|-1|1|Memo|CN|1|2|2
  6. 02|-1|-1|1|Memo|CN|1|2|2
  7. 143|-1|-1|1|Language type memo|chi|1|1|06
  8. 144|-1|-1|1|Language type memo|eng|1|1|06
  9. 145|-1|-1|1|Language type memo|spa|1|1|06
复制代码
上面的内容,如何用sed或awk,使输出为:
  1. sLanguage 142
  2. sLanguage 01
  3. sLanguage 02
  4. sLanguage 143
  5. sLanguage 144
  6. sLanguage 145
复制代码

作者: zsszss0000    时间: 2015-04-14 14:50
本帖最后由 zsszss0000 于 2015-04-14 14:50 编辑
  1. awk -vFS="|" '!/^-/{print $1}' file | awk 'NR==1{a=$0;next}{printf a":"$1"\n"}'
复制代码
  1. sLanguage:142
  2. sLanguage:01
  3. sLanguage:02
  4. sLanguage:143
  5. sLanguage:144
  6. sLanguage:145
复制代码

作者: zxy877298415    时间: 2015-04-14 15:07
  1. awk -F\| '/^[^-]/{if(NR==3) {t=$1} else {print t,$1}}' file
复制代码
回复 1# xiaoshichao143


   
作者: zsszss0000    时间: 2015-04-14 15:13
NR==2回复 3# zxy877298415


   
作者: zxy877298415    时间: 2015-04-14 15:22
回复 4# zsszss0000
横线下面有空行!


   
作者: undead244    时间: 2015-04-14 15:48
方法很笨。。。
awk -F "|" '{if(NR==2){head=$1}else if(NR>3){print head" "$1}}' filename
作者: stupid_lee    时间: 2015-04-14 15:50
本帖最后由 stupid_lee 于 2015-04-14 18:01 编辑
  1. [root@oracle ~]# awk -F"|" 'NR==2{a=$1;next}NR>3{print a" "$1}' ss.txt
  2. sLanguage 142
  3. sLanguage 01
  4. sLanguage 02
  5. sLanguage 143
  6. sLanguage 144
  7. sLanguage 145
复制代码
想要写个sed真的好难,写完再看看羊神为啥这么短
  1. sed '/^[^-]/{2{s/^([^|]*)\|(.*)/\1/g;h};4,${s/^([^|]*)\|(.*)/\1/g;G;s/(.*)\n(.*)/\2 \1/g;p}}' -nr
复制代码

作者: 我是一隻羊    时间: 2015-04-14 15:51
本帖最后由 我是一隻羊 于 2015-04-14 16:14 编辑

来个sed版...
  1. sed -r '/---/{N;N;s/-+\n|\|.*//g;h;d};G;s/([^|]+).*\n(.*)/\2 \1/' inputfile
复制代码
补一个awk版
  1. awk -F\| -vf=1 'NR==2{split($0,a,"|")}NR>3{print a[f],$f}' inputfile
复制代码
f那里定义你要取的域.
作者: xiaoshichao143    时间: 2015-04-14 16:34
回复 2# zsszss0000


    多谢大家的热心解答,就不一一答谢了。多谢!!
作者: xiaoshichao143    时间: 2015-04-14 16:39
  1. <1365 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>set ModuleName="CommTableSOAP"
  2. <1366 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>set TableName="R_CommTable_Language"
  3. <1367 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>
  4. <1367 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>set ModuleInfo=`awk -F'|' -v module="$ModuleName" '$1 == module{print "-neid "$3" -netElementType "$4" -moduleName  "$1" -version "$2}' ${ENIP_HOME}/app/modules/moduleversion.txt`
  5. <1368 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>awk -v moduleInfo="$ModuleInfo" -v table="$TableName" 'BEGIN{print "etool -c \"moduleadm propertyManagement -queryTable "moduleInfo" -tableName "table"\""}' | sh

  6. ------------------------------------------------
  7. sLanguage|sServiceID|nSPID|nServiceCode|sMemo|sLangTypeAbbr|sUsed|nSMSCodeSchema|sNBLangID
  8. ------------------------------------------------
  9. 142|-1|-1|1|Chinese|cn|1|1|01
  10. 01|-1|-1|1|Memo|CN|1|2|2
  11. 02|-1|-1|1|Memo|CN|1|2|2
  12. 143|-1|-1|1|Language type memo|chi|1|1|06
  13. 144|-1|-1|1|Language type memo|eng|1|1|06
  14. 145|-1|-1|1|Language type memo|spa|1|1|06

  15. <1369 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>awk -v moduleInfo="$ModuleInfo" -v table="$TableName" 'BEGIN{print "etool -c \"moduleadm propertyManagement -queryTable "moduleInfo" -tableName "table"\""}' | sh | sed -r '/---/{N;N;s/-+\n|\|.*//g;h;d};G;s/([^|]+).*\n(.*)/\2 \1/'


  16. sLanguage 142
  17. sLanguage 01
  18. sLanguage 02
  19. sLanguage 143
  20. sLanguage 144
  21. sLanguage 145

  22. sLanguage
  23. <1370 szxciscslx23114 [bmp] :/home/bmp/xiaoshichao>
复制代码
回复 8# 我是一隻羊

sed的如果有空行的话,会有一点小问题。   
作者: 我是一隻羊    时间: 2015-04-14 16:43
回复 10# xiaoshichao143


    你们都不贴原文本....贴出来的部分也不具有代表性....字符处理这么精确的事情当然结果会有偏差...
作者: lifayi2008    时间: 2015-04-14 17:10
  1. test@ubuntu-test:~/test$ cat test.txt
  2. ------------------------------------------------
  3. sLanguage|sServiceID|nSPID|nServiceCode|sMemo|sLangTypeAbbr|sUsed|nSMSCodeSchema|sNBLangID
  4. ------------------------------------------------
  5. 142|-1|-1|1|Chinese|cn|1|1|01
  6. 01|-1|-1|1|Memo|CN|1|2|2
  7. 02|-1|-1|1|Memo|CN|1|2|2
  8. 143|-1|-1|1|Language type memo|chi|1|1|06
  9. 144|-1|-1|1|Language type memo|eng|1|1|06
  10. 145|-1|-1|1|Language type memo|spa|1|1|06
  11. test@ubuntu-test:~/test$ awk -F"|" '!/^-*$/{if(a){print a,$1;next}{a=$1}}' test.txt
  12. sLanguage 142
  13. sLanguage 01
  14. sLanguage 02
  15. sLanguage 143
  16. sLanguage 144
  17. sLanguage 145
复制代码

作者: jcdiy0601    时间: 2015-04-18 17:38
本帖最后由 jcdiy0601 于 2015-04-18 17:39 编辑
  1. awk -F"|" '{if($1~/sLanguage/) name=$1;if($1~/[0-9]/)print name,$1}' 1
复制代码

作者: liion631818    时间: 2015-04-18 19:04
  1. lee@lee-HP-ProBook-4416s:~$ echo '------------------------------------------------
  2. sLanguage|sServiceID|nSPID|nServiceCode|sMemo|sLangTypeAbbr|sUsed|nSMSCodeSchema|sNBLangID
  3. ------------------------------------------------
  4. 142|-1|-1|1|Chinese|cn|1|1|01
  5. 01|-1|-1|1|Memo|CN|1|2|2
  6. 02|-1|-1|1|Memo|CN|1|2|2
  7. 143|-1|-1|1|Language type memo|chi|1|1|06
  8. 144|-1|-1|1|Language type memo|eng|1|1|06
  9. 145|-1|-1|1|Language type memo|spa|1|1|06' | awk -F '\|' '/sLanguage/{for(i=0; i<NF;i++)if($i=="sLanguage")col=i;next}NF>1{print "sLanguage " $col}'
  10. sLanguage 142
  11. sLanguage 01
  12. sLanguage 02
  13. sLanguage 143
  14. sLanguage 144
  15. sLanguage 145
复制代码
回复 1# xiaoshichao143


   
作者: sky_eminem    时间: 2015-04-19 21:16
awk 'BEGIN{FS="|";NR=4}{print "sLanguage   " $1}' a.txt
作者: xiaoshichao143    时间: 2015-04-27 11:26
回复 15# sky_eminem


    这个不通用,只适用于当前表。
作者: dengwei29    时间: 2015-05-08 11:12
  1. sed -r '/[a-z]/!d;s!([^|]+).*!\1!;/[a-z]/{h;d};G;s!(.*)\n(.*)!\2: \1!' file
复制代码

作者: klainogn    时间: 2015-05-08 13:49
  1. sed -rn 's/\|.*$//;ta;d;:a;/^[0-9]/{G;s/(.*)\n(.*)/\2 \1/;p;d};h' urfile
复制代码

作者: zl624867243    时间: 2015-05-10 19:34
其他人解决方式我就没看了先写上我的

  1. #!/bin/bash
  2. a=`awk -F '|' '{print $1}' file | tail -6 > 1.txt`
  3. for i in `cat 1.txt`
  4. do
  5. echo "sLanguage"  $i
  6. done
  7. rm -rf 1.txt
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2