我有这个问题,我需要同时为同一个文件打印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
等第一栏中的其他字母。
我很欣赏这方面的任何提示,
答案 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
替换为您实际想要进行的通话,这将收到每对线。