我需要将5个连续行转换为列,以便我可以执行排序和比较操作。如何将输入文件转换为包含5列和X行的表? AWK是最受欢迎的:)
输入文件
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */
ALPSGA_ATLNGA_0 {
srlg-value 1000;
srlg-cost 10000;
}
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */
ALPSGA_MACNGA_0 {
srlg-value 2000;
srlg-cost 10000;
}
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */
ALPSGA_NSVNTN_0 {
srlg-value 3000;
srlg-cost 10000;
}
输出文件
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */ ALPSGA_ATLNGA_0 { srlg-value 1000; srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */ ALPSGA_MACNGA_0 { srlg-value 2000; srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */ ALPSGA_NSVNTN_0 { srlg-value 3000; srlg-cost 10000; }
答案 0 :(得分:3)
使用awk:
$ awk 'BEGIN{RS=ORS="}\n";FS="\n";OFS=" "}{$1=$1;print}' file
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_ATLNGAMQO1ZSADDTNINF^1-A-1-O1 */ ALPSGA_ATLNGA_0 { srlg-value 1000; srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^3-A-2-O1_MACNGAHRO1ZRDCDTNINF^1-A-1-O1 */ ALPSGA_MACNGA_0 { srlg-value 2000; srlg-cost 10000; }
/* ALPSGAAKO1ZRDCDTNINF^1-A-1-O1_NSVNTNJYO1ZILADTNINF^2-A-2-O1 */ ALPSGA_NSVNTN_0 { srlg-value 3000; srlg-cost 10000; }
说明:
awk '
BEGIN{
RS=ORS="}\n" # set record separators appropriately
FS="\n" # field separator is a newline
OFS=" " # output field separator is a space
}
{
$1=$1 # rebuild record
print # output
}' file
答案 1 :(得分:1)
这是一个使用AWK的直接解决方案:对于每一行,再读4个并打印。
{
printf "%s", $0 # Print the first line
# Get the next 4 lines and print
for (i=0; i < 4; i++) {
getline
printf " %s", $0
}
printf "\n" # Finally, print a new line
}
printf
,它没有在输出中添加新行答案 2 :(得分:1)
关注awk
也可以帮助您。
awk '{ORS=$0~/^}/?"\n":FS;print}' Input_file
<强> OR 强>
awk '{ORS=$0~/^}/?"\n":FS} 1' Input_file
答案 3 :(得分:1)
由于我没有看到我的第一个想法,我觉得我必须做出贡献。 (我喜欢@james-brown的方法,但我通常不会考虑记录和字段分隔符。)
awk '{ emit=emit $0 " " } /^}$/ { print emit; emit="" }'
基本方法:始终在emit
变量上附加行,并在附加的最后一行为'}'时发出并清除emit
变量。
上面的内容将在其输出中添加一个尾随空格,其正则表达式被编码为对第五行非常敏感,只是行上的一个'}'字符。
也许不那么聪明;也许更具可读性。