![根据第一个字符串将行拆分为键值对](https://linux22.com/image/80875/%E6%A0%B9%E6%8D%AE%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B0%86%E8%A1%8C%E6%8B%86%E5%88%86%E4%B8%BA%E9%94%AE%E5%80%BC%E5%AF%B9.png)
我想知道是否有一种简单的方法可以将文件中的一行拆分为多行,例如:
我有
A B C
1 2 3 4
我想根据该行的第一个字符串得到类似的东西:
A B
A C
1 2
1 3
1 4
基本上基于行中的第一个字符串创建带有第二个、第三个和第四个字符串的多行,依此类推。
答案1
开始
awk '{for (i=2; i<=NF; ++i) print $1, $i}' file
A B
A C
1 2
1 3
1 4
答案2
printf %s\\n 'A B C' '1 2 3 4'|
sed -e's/\([^ ]*\) *[^ ]*/&\n\1/;//P;D'
A B
A C
1 2
1 3
1 4
这样可行。它选择前两个由一个或多个空格分隔的零个或多个非空格字符序列。第一个这样的序列在 中引用\1
,整个选择在 中&
。选择内容将被替换为自身,后跟\n
ewline then \1
。然后将模式空间打印到第一个出现的换行符,然后删除相同的部分,D
然后将模式空间与剩余的内容一起回收到脚本的顶部。
您可以使用 ook 命令查看它的作用l
。替换P
w/并在替换之前l
放置另一个...l
s///
A B C$
A B\nA C$
A C$
A C\nA$
A$
1 2 3 4$
1 2\n1 3 4$
1 3 4$
1 3\n1 4$
1 4$
1 4\n1$
1$
printf %s\\n 'A B C' '1 2 3 4'|
sed -ne:t -e'/ *[^ ]*/{s//\n&/2;P;s///;} -ett
A B
A C
1 2
1 3
1 4
它与至少具有一系列空格字符和任何尾随非空格的模式空间相匹配。第一个替换在第二次出现这样的序列之前插入一个换行符,然后P
打印到换行符,第二个替换删除该模式的第一次出现 - 现在还包括附加到该序列尾部的第一个换行符在第二个上操作时的顺序。每次发生替换时 est 都会分支回标签,因此一次t
会占用模式空间一个空格分隔的字段。:t
sed
再次使用l
ok:
A B C$
A B\n C$
A C$
A C$
1 2 3 4$
1 2\n 3 4$
1 3 4$
1 3\n 4$
1 4$
1 4$
答案3
使用 bash -
while read x ; do set $x ; first=$1 ; shift; for i in $* ; do echo $first $1; shift; done ; done < /tmp/1
A B
A C
1 2
1 3
1 4