同时打印两行

时间:2014-01-23 15:17:01

标签: linux bash shell awk sh

我有这个问题,我需要同时为同一个文件打印2行,问题是它必须在第一列中的行更改后发生,例如:

file:abcd.csv

a,1
a,2
a,3
a,4
a,5
a,6
b,1
b,2
b,3
b,4
b,5
b,6
c,1
c,2
c,3
c,4
c,5
c,6

代码:

awk '{ if ( $1 == "a") print $1,$2 } ' FS="," abcd.csv

打印:

a 1
a 2
a 3
a 4
a 5
a 6

但我需要同时使用两行,因为我需要将这两行连接到另一个调用:

第一个输出(然后它们将被发送):

a 1
a 2

第二个输出(然后它们将被发送):

a 2
a 3

第3个输出(然后它们将被发送):

a 3
a 4

第4个输出(然后它们将被发送):

a 4
a 5

第5个输出(然后它们将被发送):

a 5
a 6

等第一栏中的其他字母。

我很欣赏这方面的任何提示,

5 个答案:

答案 0 :(得分:3)

你需要在awk通话后管理这个:

awk -F, '$1 == "a" {print $1,$2}' abcd.csv | 
while read line1; do
    read line2
    printf "%s\n%s\n" "$line1" "$line2" | additional_call
done

答案 1 :(得分:1)

我会在无限循环中使用getline()函数,并在第一个字段与a字符不同时将其中断:

awk '
    FNR == 1 {
        while (1) {
            prev_line = $0
            r = getline
            if (r != 1) {
                exit r
            }
            split(prev_line, arr_prev, /,/)
            split($0, arr, /,/)
            if (arr_prev[1] == "a" && arr[1] == "a") {
                printf "%s\n%s\n", prev_line, $0
            }
            else {
                exit 0
            }
            print "============="
        }
    }
' infile

它产生:

a,1 
a,2 
============= 
a,2 
a,3 
============= 
a,3 
a,4 
============= 
a,4 
a,5 
============= 
a,5 
a,6 
=============

更新:为了避免无限循环,我在getline()结果中添加了一个检查,以便在文件末尾退出或出错。

答案 2 :(得分:1)

从你的问题不清楚你的意思是“两条线同时”,但下面的代码将在每个字母的两个线组中输出:

#!/usr/bin/awk -f

BEGIN { FS=","; OFS=","}
{
    count[$1]++;
    rows[$1][count[$1]] = $2;
}
END {
    for(i in count) {
        for(k=1; k<=count[i]-1; k++) {
            print i,rows[i][k]
            print i,rows[i][k+1] 
            print ""
        }
        print ""
            print ""
        }
    }

此代码将输入和输出字段分隔符设置为逗号。然后它创建一个2D哈希,第一个字母和该字母组中的行作为键,第二列作为值。

最后,它会遍历每个首字母的2D哈希值,并在该字母集合中以两个为一组打印组行值。

根据您的输入输出:

a,1
a,2

a,2
a,3

a,3
a,4

a,4
a,5

a,5
a,6



b,1
b,2

b,2
b,3

b,3
b,4

b,4
b,5

b,5
b,6



c,1
c,2

c,2
c,3

c,3
c,4

c,4
c,5

c,5
c,6

答案 3 :(得分:1)

如果您不需要使用awk,那么简单的python程序就足够了:

#!/usr/bin/python

import sys

with open(sys.argv[1], 'r') as f:
    content = f.readlines()

for i in range(len(content)-1):
    if content[i].split(',')[0] == content[i+1].split(',')[0]:
        print content[i]
        print content[i+1]

答案 4 :(得分:1)

你说你需要管道每两条线以便进行其他调用,如果你一次性产生所有输出,那么你仍然需要拆分每对线以进行另一次调用。

我只是在bash中执行以下操作,

    FILE=abcd.csv; \
    LINES=`wc -l $FILE | cut -d' ' -f1`; \
    for N in `seq 2 ${LINES}`; do \
        head -n${N} $FILE | tail -n2 | awk '{print $1,$2}' FS="," | cat;  \
    done

| cat之前的done替换为您实际想要进行的通话,这将收到每对线。