UNIX:如何使用sed / awk / grep打印文件中的特定行?

时间:2015-08-05 13:16:23

标签: sorting unix awk sed grep

我在Unix中有一个数据,它由命令提取并打印:

line01
line02
line03
line04
line05
line06
line07
line08
line09
line10
line11
line12

我希望对它进行排序,使得第10行到第12行位于第1到第9行之上。像这样:

line10
line11
line12
line01
line02
line03
line04
line05
line06
line07
line08
line09

我尝试使用

<command that fetches the data> | awk 'NR>=10 || NR<=9'

<command that fetches the data> | sed -n -e '4,5p' -e '1,3p'

但它仍然按排序顺序显示。我是unix的新手,所以我不知道如何正确使用awk / sed。

PS。这些数据存储在一个变量中,然后由另一个命令处理。所以我需要对它进行排序,以便首先处理第10-12行。 :)

3 个答案:

答案 0 :(得分:3)

使用telnet mail.smtp.host 25 head

tail

您的$ tail -n 2 file && head -n 3 file name4 name5 name1 name2 name3 awk方法不起作用,因为您只是说:打印行号X,Y和Z,一旦找到任何一个,就会这样做。如果您想使用这些工具,则需要先读取文件,存储其内容,然后再打印。

sed

甚至可以将订单作为变量:

$ awk -v OFS="\n"  '{a[NR]=$0} END {print a[4], a[5], a[1], a[2], a[3]}' file
name4
name5
name1
name2
name3

如果您想将行的顺序作为参数,您可以使用process substitutionawk -v order="4 5 1 2 3" 'BEGIN {split(order,lines)} {a[NR]=$0} END {for (i=1;i<=length(lines);i++) print a[lines[i]]}' file 并使用FNR / NR来区分输入和文件

或者您可以使用awk '...' <(command) file从stdin读取第一个文件:

-

作为单行:

echo "4 5 1 2 3" | awk 'FNR==NR {n=split($0,lines); next}
    {a[FNR]=$0}
    END {for (i=1;i<=n;i++) print a[lines[i]]}' - file

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '1h;2,9H;1,9d;12G' file

用第1行替换保留空间,然后将第2行到第9行附加到保留空间并删除第1行到第9行。正常打印所有其他行但在第12行将存储在保留空间中的行追加到模式空间。

答案 2 :(得分:0)

实际使用Sub populateArray() Dim arrColOne() As Variant, arrColTwo() As Variant, arrColThree() As Variant Dim arrAllData() As Variant Dim i As Long arrColOne = Range("A2:A" & lrow(1)) 'amend column number arrColTwo = Range("D2:D" & lrow(4)) arrColThree = Range("G2:G" & lrow(7)) ReDim arrAllData(1 To UBound(arrColOne, 1), 2) As Variant For i = 1 To UBound(arrColOne, 1) arrAllData(i, 0) = arrColOne(i, 1) arrAllData(i, 1) = arrColTwo(i, 1) arrAllData(i, 2) = arrColThree(i, 1) Next i End Sub Public Function lrow(colNum As Integer) As Long lrow = Cells(Rows.Count, colNum).End(xlUp).Row End Function

sort

$ sort -r -s -k 1.5,1.5 /tmp/lines line10 line11 line12 line01 line02 line03 line04 line05 line06 line07 line08 line09 表示我只使用第一个单词的第5个字符进行排序。 -k 1.5,1.5表示反向顺序,-r表示稳定 - 保留具有相同顺序的第5个字符的行。