【问题标题】:How extract a field from file with awk without separators in Unix如何在 Unix 中使用不带分隔符的 awk 从文件中提取字段
【发布时间】:2013-06-02 04:32:15
【问题描述】:

我有一个名为“file”的文件,其中有一些字段用分隔符分隔。文件结构为:

@field1@field2@field3@field4

使用 awk 我提取了没有分隔符的字段。

vr=$file;

sep_mx=`echo $vr | awk '{
    n=split($0,x,"@");
    print n
}'` 
echo $sep_mx
## here the number of substring produced is calc.

while ((i<=$max)); 
do
    # would print individual substring one at a
    # time as the counter increases.
    echo $vr | awk -v er=$i '{
        n=split($0,x,"@"); print x[er]
    }'
    ((i+=1))
done

输出是:

field1
field2
field3
field4

如果我只想从我刚刚发布的代码中提取第二个字段,我该怎么做?谢谢

【问题讨论】:

  • 您发布的脚本无法从发布的输入生成发布的输出。您应该更新您的帖子以显示您实际使用的脚本。

标签: shell unix awk ksh separator


【解决方案1】:

这应该可以:

awk -F@ '{print $3}' file

一般情况下,尽量使用-F。它的意思是“字段分隔符”,让您的生活更轻松,无需拆分、substr 之类的东西。

测试

$ awk -F@ '{print $3}' file
field2

【讨论】:

  • 谢谢,但如果我的分隔符类似于“@#”?我想我不能写$ awk -F@# '{print $3}' file 对吧?
  • +1 我喜欢这个问题是关于not 使用分隔符解决问题的方式,而这里的答案是use 分隔符。好笑。
  • 谢谢!也许我应该坚持不使用分隔符,但我发现在 awk 中突出显示 -F 很重要,因为它对于这些情况来说是一个非常强大的工具。
【解决方案2】:

bash:

$ while IFS=@ read -r col1 col2 col3 col4; do 
      echo $col3
  done <<< '@field1@field2@field3@field4'
field2

awk 的另一种方式

$ awk '{split($0,ary,/@/); print ary[3]}' <<< '@field1@field2@field3@field4'
field2

【讨论】:

  • 抱歉,这不适用于具有多行此模式的文件。将awk$3 一起使用将在文件中所有 行的第三列进行操作。
  • 为什么要在 $1 上使用 split() 而不是只分配 FS 并让 awk 自然地将记录拆分为字段?此外,如果前 2 个“@”符号之间的文本包含任何空格,那么您拥有它的方式将失败。
  • @EdMorton Split 现在应该可以工作了,我将解决方案更改为使用$0 而不是$1
  • @Jaypal 是的,它现在可以正常工作,但与awk -F@ '{print $3}' 相比,这样做仍然没有意义。
  • @End.Game 你可以做类似awk 'BEGIN { f="'"'"'" } {split($0,ary,/@/); printf "%s\n", f ary[3] f}' &lt;&lt;&lt; '@field1@field2@field3@field4'
【解决方案3】:

GNU sed 调用

sed -r 's/\W\w+\W(\w+).*/\1/' file

输出

field2

【讨论】:

    【解决方案4】:

    您的代码没有意义。如果要转换

    @field1@field2@field3@field4
    

    field1
    field2
    field3
    field4
    

    那么您只需要这个(或任何其他简单的解决方案):

    $ cat file
    @field1@field2@field3@field4
    $ 
    $ gawk -v RS='[@\n]' 'NR>1' file
    field1
    field2
    field3
    field4
    

    如果你想打印文本“field3”那么它很简单:

    $ gawk -v RS='[@\n]' 'NR==4' file 
    field3
    

    记录号是 4 而不是 3,因为您的文件以“@”开头,所以“field1”之前有一条空记录。

    如果您告诉我们您真正想要做什么,我们可以帮助您,但到目前为止,您似乎走错了路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 2011-12-13
      • 2020-12-02
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多