Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Linux 将多个记录合并为具有所有非空值的唯一记录_Linux_Shell_Unix - Fatal编程技术网

Linux 将多个记录合并为具有所有非空值的唯一记录

Linux 将多个记录合并为具有所有非空值的唯一记录,linux,shell,unix,Linux,Shell,Unix,假设我有3条记录: P1||1234| P1|56001|| P1|||NJ 我想将这3条记录合并为一条具有所有属性的记录。最后记录: P1|56001|1234|NJ 在Unix/Linux中有什么方法可以实现这一点吗?我想您可以使用bash、awk、sed等来寻求解决方案。 你可以试试类似的东西 $ cat test.txt P1||1234| P1|56001|| P1|||NJ $ cat test.txt | awk -F'|' '{ for (i = 1; i <= NF

假设我有3条记录:

P1||1234|
P1|56001||
P1|||NJ
我想将这3条记录合并为一条具有所有属性的记录。最后记录:

P1|56001|1234|NJ

在Unix/Linux中有什么方法可以实现这一点吗?

我想您可以使用bash、awk、sed等来寻求解决方案。 你可以试试类似的东西

$ cat test.txt 
P1||1234|
P1|56001||
P1|||NJ
$ cat test.txt | awk -F'|' '{ for (i = 1; i <= NF; i++) print $i }' | egrep '.+' | sort | uniq | awk 'BEGIN{ c = "" } { printf c $0; c = "|" } END{ printf "\n" }'
1234|56001|NJ|P1

在您的示例中,第一行是
1234
,第二行是
56001

我不明白为什么在你的最终结果中,
56001
1234
之前。我想这是个打字错误

awk oneliner可以完成以下任务:

awk -F'|' '{for(i=2;i<=NF;i++)if($i)a[$1]=(a[$1]?a[$1]"|":"")$i}END{print $1"|"a[$1]}'

awk-F'|''{for(i=2;无论是Linux还是UNIX都是一种编程语言,它们是操作系统。考虑用你所需要的编程语言来标记这一点,以从他们各自的社区得到答案。”TylerD,当我理解OP时,他不需要特定的语言,而只是一种解决方案,它与“代码”> CAT AWK GRYP排序(UNIQ)AWK无关。
P1
应该在行的开头,对吗?@Kent,我不确定。正如你所见,我在我的解决方案中没有考虑到这一点。如果是的话,应该采用你的解决方案。Alper,@Kent感谢你的回答。我想,我没有明确要求。我正在寻找一种解决方案,它将从多个字段中获取非空值记录在同一列中,并将准备最终记录。
即,由于第一条记录的第三列为非空“1234”,第二条记录的第二列为非空“56001”,第三条记录的第四列为非空,值为“NJ”。最终记录应为
P1 | 56001 | 1234 | NJ
awk -F'|' '{for(i=2;i<=NF;i++)if($i)a[$1]=(a[$1]?a[$1]"|":"")$i}END{print $1"|"a[$1]}'
kent$  echo "P1||1234|
P1|56001||
P1||NJ"|awk -F'|' '{for(i=2;i<=NF;i++)if($i)a[$1]=(a[$1]?a[$1]"|":"")$i}END{print $1"|"a[$1]}'
P1|1234|56001|NJ