【问题标题】:Unix separate string line with delimiterUnix用分隔符分隔字符串行
【发布时间】:2013-07-19 11:27:19
【问题描述】:

我在 txt 文件中有几行这样的字符串:

input.txt-->

abc;def;ghi jklm;mno pqr;
abcde;fgh;ijk lmno;pqrs tuv;

我的代码是这样的。它不适用于空间。 请帮忙。

awk -F";" '{print $1,$2,$3,$4}' input.txt | while read var1    
var2 var3 var4 
Do
 echo 'var1 = ' $var1
 echo 'var2 = ' $var2
 echo 'var3 = ' $var3
 echo 'var4 = ' $var4
Done

想要的输出-->

var1 = abc
var2 = def
var3 = ghi jklm
var4 = mno pqr

var1 =abcde
var2 =fgh
var3 =ijk lmno
var4 =pqrs tuv

【问题讨论】:

  • 为什么要将 awk 输出传递给 while read ... do ; ... done 循环。您可以在awk 中获得更复杂的解析和打印。祝你好运。

标签: unix awk delimiter


【解决方案1】:

这样就可以了:

while IFS=';' read -r val1 val2 val3 val4
do
  echo "val1 = $val1"
  echo "val2 = $val2"
  echo "val3 = $val3"
  echo "val4 = $val4"
done < input.txt

要考虑的基本方面是IFS=";",它定义了输入字段分隔符。使用read -r val1 .. val4,我们指示将定义哪些变量。

awk 会更容易:

$ awk -F";" '{for (i=1; i<NF; i++) {print "val"i,"=",$i}}' input.txt

它基本上将; 定义为与-F ";" 的字段分隔符。然后使用for i 循环遍历所有这些字段并打印它们。 NF 表示字段数,循环最多NF-1,因此最后一个空的不显示。 Thanks JS웃 for the tip :)

测试

$ while IFS=';' read -r val1 val2 val3 val4; do echo "val1 = $val1"; echo "val2 = $val2"; echo "val3 = $val3"; echo "val4 = $val4"; echo; done < a
val1 = abc
val2 = def
val3 = ghi jklm
val4 = mno pqr

val1 = abcde
val2 = fgh
val3 = ijk lmno
val4 = pqrs tuv

awk版本:

$ awk -F";" '{for (i=1; i<NF; i++) {print "val"i,"=",$i}}' a
val1 = abc
val2 = def
val3 = ghi jklm
val4 = mno pqr
val1 = abcde
val2 = fgh
val3 = ijk lmno
val4 = pqrs tuv

【讨论】:

  • 谢谢@Kent,我正在调整我的测试以显示预期的变量......并错过了其中一些:)
  • +1 表示awk 版本,您可以使用&lt;NF 而不是&lt;=NF 来防止if 循环
  • 哦,谢谢@JS웃!所以我在朋友的帮助下回答了这个问题
  • @fedorqui Dando y dando, pajarito volando
  • 呵呵,在这些标签里我们就是这样的一家人 :) @JS웃
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2023-02-25
  • 1970-01-01
相关资源
最近更新 更多