如何使用awk / sed重新格式化此文本

时间:2019-06-20 22:31:49

标签: awk sed

每个人。我有一个像这样的文本文件:

1
question1
answer1
2
question2
answer2
3
question3
answer3
<etc>

我已经使用awk阅读(但未成功尝试)许多不同的方式。我不是程序员,所以awk很难理解。

awk中有很多专家,所以我希望您能向我展示执行此操作的正确命令。

谢谢您的帮助!

我想消除编号的行(第1,第4,第7等),然后在问题和答案之间加上逗号,以便生成的文本文件如下所示:

question1, answer1
question2, answer2
question3, answer3
<etc>

4 个答案:

答案 0 :(得分:3)

igen::Quaterniond eigen_quat;  
tf::Quaternion tf_quat;

// Call the function
tf::quaternionEigenToTF (eigen_quat, tf_quat); 

答案 1 :(得分:2)

使用GNU sed。删除从第一行(1~3d开始的每三行,将输入的下一行追加到sed的模式空间(N)中,并替换sed的模式空间(s/\n/, /中现在包含的换行符)。

sed '1~3d; N; s/\n/, /' file

输出:

question1, answer1
question2, answer2
question3, answer3

答案 2 :(得分:1)

这可能对您有用(GNU sed):

sed -n 'n;N;s/\n/, /p' file

默认情况下,sed将打印其处理的每一行,但是您可以使用-n选项将其关闭,现在sed仅在我们希望的时候打印。

n命令通常会打印当前行并将其替换为下一行,但是由于我们要求它仅按需打印,因此实际上会丢失当前行。

N命令将下一行追加到当前行。 sed通常在处理一行之前先去除所有换行符,它会先在当前行后面添加一个换行符\n,然后再添加下一行。

s/\n/, /p命令将此换行符替换为,,后跟一个空格。如果替换成功,替换命令末尾的p标志将打印当前行中的所有内容。当我们将当前行构造为在其中包含换行符(N)时,我们知道这将始终发生。

总而言之,命令:删除第一行,用换行符连接第二和第三行,然后用逗号后跟空格替换该换行符并打印结果。重复。

一些替代方法:

sed 'N;s/.*\n//;N;s/\n/, /' file

sed 'N;N;s/.*\n\(.*\)\n/\1, /' file

sed -En 'n;N;G;s/(.)(.*)\1$/, \2/' file

最后一个解决方案类似于第一个解决方案,但是从不直接引用换行符。

答案 3 :(得分:0)

这似乎可行:

awk '{
    if ($0 ~ /^[0-9]+$/) {
       /* eliminates lines of all numbers */
    } else if (x == "") {
        /* save until next line is available */
        x = $1;
    } else {
        /* print both */
        print x "," $1;
        /* reset flag */
        x = "";
    }
}'

这不是最优雅的awk,因为它比它设计的模式->操作更具程序性。...