[英]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
| cat
在done
您实际要拨打的电话之前,将收到每对电话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.