Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash使用条件添加行_Bash_Line - Fatal编程技术网

Bash使用条件添加行

Bash使用条件添加行,bash,line,Bash,Line,我有一个参考文件,其中只有一列是这样的: 文件1: a b c d e 在第二个csv文件中,我有几个列。在这些列的第一列中,参考文件中存在一些值: 文件2: A.34;42;23;45;1 C3.2.1.7.8 E6.2.2.1.三, 我想得到的是,添加file1中存在但file2中不存在的行,其中某些列的值为常量,最后一列的值为零,以便: a;34;42;23;45;1 B成本1;成本2;成本3;成本4;0 C3.2.1.7.8 D成本1;成本2;成本3;成本4;0 E6.2.2.1.三,

我有一个参考文件,其中只有一列是这样的:

文件1:
a
b
c
d
e

在第二个csv文件中,我有几个列。在这些列的第一列中,参考文件中存在一些值:

文件2:
A.34;42;23;45;1
C3.2.1.7.8
E6.2.2.1.三,

我想得到的是,添加file1中存在但file2中不存在的行,其中某些列的值为常量,最后一列的值为零,以便:

a;34;42;23;45;1
B成本1;成本2;成本3;成本4;0
C3.2.1.7.8
D成本1;成本2;成本3;成本4;0
E6.2.2.1.三,

有什么帮助吗

谢谢。

(cat文件2;comm-23文件1
(cat文件2;comm-23文件1
( cat file2  ; comm -23 file1 <(cut -d';' -f1 file2) \
| sed 's/$/;cost1;cost2;cost3;cost4;0/' ) | sort
输出将按未定义的顺序进行(除非所有新行都将首先打印)。如果您使用GNU AWK(
gawk
),并且需要对行进行排序,则可以将新行保存在数组中,而不是立即打印,然后使用
asort()
函数。否则,您可以使用外部
排序
实用程序

分为多行:

awk '
    BEGIN {
        FS = OFS = ";"
    } 
    FNR == NR {
        arr[$1] = $0; 
        next
    } 
    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 
    END {
        for (i in arr) {
            print arr[i]
        }
    }' file2 file1
编辑:

要在文件2中容纳具有相同字段1的多行,请更改此行:

        arr[$1] = $0;

并在其后面立即添加此行:

        lines[$0]
然后更改这些行:

        for (i in arr) {
            print arr[i]

编辑2:

要使用不同的值打印添加的行10次,请更改此部分:

    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 

!(arr为1美元){
对于(i=1;i
输出将按未定义的顺序进行(除非所有新行都将首先打印)。如果您使用GNU AWK(
gawk
),并且需要对行进行排序,则可以将新行保存在数组中,而不是立即打印,然后使用
asort()
函数。否则,您可以使用外部
排序
实用程序

分为多行:

awk '
    BEGIN {
        FS = OFS = ";"
    } 
    FNR == NR {
        arr[$1] = $0; 
        next
    } 
    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 
    END {
        for (i in arr) {
            print arr[i]
        }
    }' file2 file1
编辑:

要在文件2中容纳具有相同字段1的多行,请更改此行:

        arr[$1] = $0;

并在其后面立即添加此行:

        lines[$0]
然后更改这些行:

        for (i in arr) {
            print arr[i]

编辑2:

要使用不同的值打印添加的行10次,请更改此部分:

    ! ($1 in arr) {
        print $1, "cost1;cost2;cost3;cost4;0"
    } 

!(arr为1美元){

对于(i=1;i这非常有效。唯一的问题是,在文件2中,每一行可以重复多行。因此,例如,带有a、c或d的多行。对于此代码的结尾,每个值只报告一行。希望这是清楚的。无论如何,非常感谢。这非常有用。@g256:qu中未指定该条件估计。请查看我编辑过的答案,以了解应该适应它的更改。轻微更改:如果我想插入缺失的行,让我们假设10次,在const2的位置插入10个不同的常量?(当然,对于所有缺失的行)这会很困难吗?谢谢你的支持。这非常有效。唯一的问题是,在文件2中,每一行可以重复多行。因此,例如,使用a、c或d的多行代码。在代码末尾,每个值只报告一行。希望这是清楚的。无论如何,非常感谢。这非常有用。@g256:that co问题中未指定条件。请参阅我编辑的答案,以了解应适应它的更改。轻微更改:如果我想插入缺失的行,让我们假设在const2位置插入10次,10个不同的常数?(当然,对于所有缺失的行)这会很困难吗?谢谢你的支持。这没问题,它将允许遍历所有行。@octopusgrabbus。但是如何将其放在脚本中,而不是命令行中?我在意外标记附近遇到了
语法错误(“
当午餐脚本时。但在命令行中工作。@g256我添加了另一个可以轻松复制和粘贴的变体。我仍然在意外标记附近遇到语法错误。可能是因为我在不同文件的for循环中执行它,例如:for i in*file;do;your code;doneI编辑以避免滚动。您可以加入该行s以形成一行,并确保删除行的延续字符“\”。这样可以,它将允许遍历所有行。@octopusgrabbus。但是如何将其放在脚本中,而不是命令行中?我在意外标记附近遇到
语法错误(“
当午餐脚本时。但在命令行中工作。@g256我添加了另一个可以轻松复制和粘贴的变体。我仍然在意外标记附近遇到语法错误。可能是因为我在不同文件的for循环中执行它,例如:for i in*file;do;your code;doneI编辑以避免滚动。您可以加入该行s以形成一行,并确保删除行的延续字符“\”。
    ! ($1 in arr) {
        for (i = 1; i <= 10; i++) {
            print $1, "cost1", i, "cost3;cost4;0"
        }
    }