【问题标题】:How to print varying fields from input lines in Unix如何从 Unix 中的输入行打印不同的字段
【发布时间】:2015-05-16 23:58:20
【问题描述】:

我是 KSH 脚本的新手,需要知道我在哪里犯了错误。我需要从 abc.dat 文件中打印字段 1 和字段 2。

#!/bin/ksh

f="abc.dat"
l=`sed '1d;$d' $f|wc -l`
l1=2
while ( $l1 -lt $l ) 
do
   echo 'First Field= '`sed -n "${l1}p" $f|cut -d"|" -f1` ', then second field= ' `sed -n "${l1}p" $f|cut -d"|" -f2`
   (( l1++ ))
done

对不起..我有一个包含以下数据的文件,

Allan|2000|5000
Smith|5000|3000
Roy|1000|3000

我需要下面的输出和 KSH 脚本,

first field=Allan, then 2nd field=2000
first field=Smith, then 2nd field=3000

等等……

谢谢你 示例输入.txt

Test1|1|2|3|4|5|6|7
Test2|1|2|3|4|5|6|7
Test3|1|2|3|4|5|6|7
Sometext|b|c|d|e|f|g
Test5|1|2|3|4|5|6|7
Test6|1|2|3|4|5|6|7

输出:

First field=Test1, then 2nd field=Field: 1
First field=Test2, then 2nd field=Field: 2
First field=Test3, then 2nd field=Field: 3
First field=Sometext, then 2nd field=Field: e
First field=Test5, then 2nd field=Field: 5
First field=Test6, then 2nd field=Field: 6

【问题讨论】:

  • 请张贴清晰的输入/输出样本。即:“我有这个”和“我需要这个”。
  • 对不起佩德罗...我有一个文件
  • 我已经明白了……
  • ksh 没有相当于 bash 的read?因为你应该这样做。

标签: shell awk ksh


【解决方案1】:

尝试以下方法:

awk -F'|' '{ printf "first field=%s, then 2nd field=%s\n", $1, $(NR+1) }' input.txt
  • awk 将每个输入行拆分为 | (-F'|') 的字段。
  • printf 然后打印带有每个输入行的第一个字段 ($1) 和第 n 个字段 ($(NR+1)) 的格式字符串,其中 n 计算为当前输入行数 (NR) + 1。

除了更简单之外,这个awk 解决方案通常比在 shell 代码中循环的解决方案执行得更好 - 最好避免 shell 代码中的循环,尤其是在每次调用外部实用程序时迭代。

【讨论】:

    【解决方案2】:

    我会指出你在 Awk:

    cat data_file | awk -F\| '{print "First field" $1 ", then 2nd field =" $2}'
    

    这会将 Awk 的字段分隔符设置为管道符号并有效地为您拆分行。 awk 绝对是一个了解一点的工具。老实说,人们尝试使用 Sed 的许多方式都更适合 Awk。 :)

    【讨论】:

    • 这适用于第一行。第二行需要 3 美元,第三行需要 4 美元。这就是为什么while IFS="|" read field1 field2 也不起作用的原因。
    • 我并没有从您的问题中删除这一点。您可能想要编辑它。您声明“第一个字段,第二个字段,第一个字段,第二个字段。”
    • 我编辑了这个问题,因为我第一次阅读这个问题时也错过了它。 first field=Smith, then 2nd field=3000 的例子给了我一个线索。
    【解决方案3】:

    当字段没有空格时,可以使用cut作为解决方案:

    lastfield=2
    while read -r line; do
       printf "First field=%s, second field=%s\n" $(echo ${line}|cut -d"|" -f1,${lastfield} | sed 's/|/ /')
       (( lastfield = lastfield + 1 ))
    done < input.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      相关资源
      最近更新 更多