繁体   English   中英

同时打印两行

[英]Print two lines at the same time

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

文件: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

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

a 3
a 4

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

a 4
a 5

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

a 5
a 6

对于第一栏中的其他字母,依此类推。

我对此表示感谢,

您需要在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

我会使用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()结果中添加了一个检查,以在文件末尾退出或出现错误。

从您的问题中不清楚“同一时间两行”是什么意思,但是以下代码将在每个字母的两个行组中输出:

#!/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

如果您不需要使用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]

您说您需要对每两行进行管道传输,以便进行其他调用,如果您一次性生成所有输出,则仍然需要拆分每对行才能进行此另一调用。

我只是用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 | catdone您实际要拨打的电话之前,将收到每对电话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM