如何将文本文件的每两行与Bash配对?

时间:2009-10-03 14:24:41

标签: bash sed text-files

使用简单的bash脚本,我生成一个包含许多行的文本文件:

192.168.1.1
hostname1
192.168.1.2
hostname2
192.168.1.3
hostname3

现在我想重新格式化这个文件,看起来像这样:

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

我将如何以这种方式重新格式化?也许是sed

3 个答案:

答案 0 :(得分:40)

$ sed '$!N;s/\n/ /' infile
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

答案 1 :(得分:33)

这是一个仅限shell的替代方案:

while read first; do read second; echo "$first $second"; done

答案 2 :(得分:21)

我喜欢这个解决方案的简单性

function ifproductPublished($productID){
    $conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    $sql = "SELECT product_status FROM product_list WHERE product_id='$productID'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) 
    {
        while($row = $result->fetch_assoc()) {      
        $product_status = $row["product_status"];                       
        if($product_status == 1){
            return true;
        } else {
            return false;
        }
        }       
        } else {
        echo "No results found";
    }
    $conn->close();
}

或以逗号分隔而不是空格分隔

cat infile | paste -sd ' \n'

192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3

如果您的输入文件有第三行,如timestamp

cat infile | paste -sd ',\n'

然后唯一的变化是在分隔符列表中添加另一个空格

192.168.1.1
hostname1
14423289909
192.168.1.2
hostname2
14423289910
192.168.1.3
hostname3
14423289911