需要在双引号中用相同的字符串替换所有用0开头的字符串(除了具有/和。)

时间:2017-11-15 03:34:32

标签: awk

    awk '{for(i=1;i<=NF;i++){if($i~/^0[a-z,0-9][a-z,0-9]/){print $i}}}' test1 > test3

 doWork()

 { rm /tmp/test1 && awk '{sub(/'$I'/, "\"'$I'\"", $0); print}' >test1;} < test1

 for I in `cat /tmp/test3`
 do doWork;
 done;

输入文字文件:

  

/ tmp #cat test1 1234 012345   0.000 01/02/03 01234 05554567 educwertyu 0099 0000 000012   1800.000000 099000 0123456789

当前输出:

  

1234“”01234“5”   0.000 01/02/03“01234”“05554567”“Wikwertyu”“0099”“0000”“000012”   1800.“0000”00“099000”“”01234“5”6789

预期产出:

  

1234“012345”   0.000 01/02/03“01234”“05554567”“Wikwertyu”0099“0000”“000012”   1800.000000“099000”“0123456789”

2 个答案:

答案 0 :(得分:0)

$ awk -v dq='"' '{for(i=1;i<=NF;i++) if($i~/^0/ && $i!~/[./]/) $i=dq $i dq} 1' file
1234 "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000" "000012"
1800.000000
"099000"
"0123456789"
  • 这不会保留输入间距,但如果输入tab分开,则相应地设置FS / OFS .. awk -v dq='"' 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++) if($i~/^0/ && $i!~/[./]/) $i=dq $i dq} 1'
  • -v dq='"'变量用于存储双引号
  • for(i=1;i<=NF;i++)遍历所有输入字段
  • if($i~/^0/ && $i!~/[./]/)如果任何字段以0开头且没有./
    • $i=dq $i dq用双引号
    • 包围该字段
  • 1打印输入记录,包括对字段所做的任何更改


保留间距

$ perl -lpe 's#(^|\h)\K0[^./\h]+(?=\h|$)#"$&"#g' file
1234    "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000"  "000012"
1800.000000
"099000"
"0123456789"

答案 1 :(得分:0)

  

是的,也应该引用0099。我忘记了。

$ awk -v q='"' '{for(i=1; i<=NF; i++)if($i ~/^0[[:alnum:]][^.\/]/)$i=q $i q}1' infile
1234 "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000" "000012"
1800.000000
"099000"
"0123456789"

输入:

$ cat infile
1234      012345
0.000
01/02/03
01234
05554567
0qwertyu
0099
0000           000012
1800.000000
099000
0123456789

说明:

/^0[[:alnum:]][^.\/]/

  • ^在字符串
  • 的开头断言位置
  • 0匹配字符0字面
  • 匹配以下列表中的单个字符[[:alnum:]] [:alnum:]匹配字母数字字符[a-zA-Z0-9]
  • 匹配[^.\/]下方列表中不存在的单个字符 .匹配角色。按照字面 \/匹配字符/字面