如何在Unix中从输入行打印不同的字段

时间:2015-05-16 23:58:21

标签: shell awk ksh

我是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

依旧......

谢谢你 示例input.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

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

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

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

答案 1 :(得分:0)

我会指出你在Awk:

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

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

答案 2 :(得分:0)

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

    $page_number = isset($_GET['page']) ? $_GET['page'] : 1;
    $offset = 10 * ($page - 1);
    $sql = "SELECT * FROM categories ORDER BY category_title ASC LIMIT $offset, 10";