awk在查找图案时连接或合并线条

awk在查找图案时连接或合并线条,awk,sed,Awk,Sed,我有一些数据在一个文件中,我需要排序(可能使用awk),如果可能的话,将感谢一些帮助 这是该文件的一个小样本 DEFAULT,number,7996012132,,test,1,SP_A,SIX,,, ,,,,FOUR,,, ,,,,NINE,,, ,,,,TWO,,, DEFAULT,number,7996020217,,test,1,SP_B,,,,, DEFAULT,number,7996020218,,test,1,SP_B,,,,, DEFAULT,number,79960

我有一些数据在一个文件中,我需要排序(可能使用awk),如果可能的话,将感谢一些帮助

这是该文件的一个小样本

DEFAULT,number,7996012132,,test,1,SP_A,SIX,,,

,,,,FOUR,,,

,,,,NINE,,,

,,,,TWO,,,

DEFAULT,number,7996020217,,test,1,SP_B,,,,,

DEFAULT,number,7996020218,,test,1,SP_B,,,,,

DEFAULT,number,7996020218,,test,1,SP_A,THREE,,,

,,,,TWO,,,

,,,,NINE,,,

,,,,THREE,,,

DEFAULT,number,7996020215,,test,1,SP_B,,,,,

DEFAULT,number,7996020216,,test,1,SP_A,SIX,,,

,,,,SEVEN,,,

,,,,EIGHT,,,

,,,,FOUR,,,
第1步我想把线放在一起

DEFAULT,number,7996012132,,test,1,SP_A,SIX,,,,,,,FOUR,,,,,,,NINE,,,,,,,TWO,,,
DEFAULT,number,7996020217,,test,1,SP_B,,,,,
DEFAULT,number,7996020218,,test,1,SP_B,,,,,
DEFAULT,number,7996020218,,test,1,SP_A,THREE,,,,,,,TWO,,,,,,,NINE,,,,,,,THREE,,,
DEFAULT,number,7996020215,,test,1,SP_B,,,,,
DEFAULT,number,7996020216,,test,1,SP_A,SIX,,,,,,,SEVEN,,,,,,,EIGHT,,,,,,,FOUR,,,
步骤2我想过滤掉只有数字4的行

DEFAULT,number,7996012132,,test,1,SP_A,,SIX,,,,,,,FOUR,,,,,,,NINE,,,,,,,TWO,,,
DEFAULT,number,7996020216,,test,1,SP_A,,SIX,,,,,,,SEVEN,,,,,,,EIGHT,,,,,,,FOUR,,,
步骤3我只想显示以下内容

7996012132 FOUR

7996020216 FOUR
有什么想法吗?提前谢谢

以下是我的解决方案:

awk 'BEGIN {line=""} /DEFAULT/ {print line; line=$0} !/DEFAULT/ {line = line""$0} END {print line}' data.txt | awk -F, '/FOUR/ {print $3" FOUR"}'
解释:

# Initialize line variable to blank
BEGIN { line="" }            

# If the line contains DEFAULT, print what we have and start a new aggregation
/DEFAULT/ { print line; line=$0 }

# If the line does not contain DEFAULT, add this line to the variable
!/DEFAULT/ { line = line""$0 }

# At the end, print whatever we have
END { print line }
然后,您可以根据包含“四”的行,用
作为字段分隔符,解析出所需的数字:

awk -F, '/FOUR/ {print $3" FOUR"}'
第一部分:

/^$/ {next}                                     # this removes the empty records in your data
{
    printf "%s", (NR > 1 && /^DEF/ ?ORS:"") $1  # print
}
测试它:

$ awk -f foo.awk foo.txt
DEFAULT,number,7996012132,,test,1,SP_A,SIX,,,,,,,FOUR,,,,,,,NINE,,,,,,,TWO,,,
DEFAULT,number,7996020217,,test,1,SP_B,,,,,
DEFAULT,number,7996020218,,test,1,SP_B,,,,,
DEFAULT,number,7996020218,,test,1,SP_A,THREE,,,,,,,TWO,,,,,,,NINE,,,,,,,THREE,,,
DEFAULT,number,7996020215,,test,1,SP_B,,,,,
DEFAULT,number,7996020216,,test,1,SP_A,SIX,,,,,,,SEVEN,,,,,,,EIGHT,,,,,,,FOUR,,,
第二部分:

/^$/ {next} 
/^DEF/ {
    if(NR>1&&foo~/FOUR/)print foo;foo=""
} 
{
    foo=foo $1
} 
END{if(foo~/FOUR/) print foo}

这不是一个代码编写服务。到目前为止你尝试了什么?发布你的代码!你运行它时发生了什么?你以为会发生什么?你有什么特别的问题吗?非常好的Alex,非常感谢,非常感谢!!祝你周末愉快!我很高兴它对你有用!如果此解决方案对您有帮助,您是否可以将其标记为已接受?