我有两列的.txt文件(制表符分隔)。第一列用逗号分隔多个值。输入格式
a,b,c x
a y
c,d,e z
所需的输出
a x
b x
c x
a y
c z
d z
e z
逗号分隔条目的数量在1-40之间变化。我尝试了下面的awk命令,但只有在第一列中有两个以逗号分隔的条目时才会起作用:
awk 'BEGIN{FS="[ ,]"} {print $1, $NF; print $2, $NF}' input
如何修改可以完成工作的上述命令(或任何新命令)。感谢。
答案 0 :(得分:3)
另一个<table>
<tr>
<td colspan="2"><label for="getTheKeys">Enter the key string: </label><input type="text" id="getTheKeys" value="abcdefghijklmnopqrstuvwxyz0123456789+-" size="53"/></td>
<tr>
<tr>
<td><label for="encrypt">Encrypt: </label><input type="text" id="encrypt" value="" placeholder="Enter a number"/></td>
<td class="giveMeSomeSpace"><label for="encrypted">Encrypted: </label><input type="text" id="encrypted" value="" readonly="readonly" /></td>
<tr>
<tr>
<td><label for="decrypt">Decrypt: </label><input type="text" id="decrypt" value="" placeholder="Enter a key combination"/></td>
<td class="giveMeSomeSpace"><label for="decrypted">Decrypted: </label><input type="text" id="decrypted" value="" readonly="readonly" /></td>
<tr>
</table>
<input type="button" id="checkNow" value="Go" onclick="encryptDecrypt();" />
awk
将字段分隔符设置为空格或逗号,使用最后一个字段打印所有字段对(直到最后一个字段)。
答案 1 :(得分:2)
Perl救援!
perl -lane 'print "$F[0] $_ $F[2]" for glob "{$F[1]}"' file
-n
逐行读取输入行-l
从输入中删除换行符并将其添加到打印件-a
将空格上的每一行拆分为@F数组更新:您更改了规范(未标记任何更新)。解决方案仍然类似,只需使用
perl -lane 'print "$_ $F[1]" for glob "{$F[0]}"' file
答案 2 :(得分:1)
awk的split救援功能:
awk '{split($1,arr,","); for (key in arr) { print arr[key],$2 }}' input
答案 3 :(得分:1)
BEGIN {
FS = "\t"
}
NF == 2 {
n = split($1, a, ",")
for (i = 1; i <= n; i++) {
print a[i], $2
}
}
答案 4 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/\s+(\S+)$/ \1/;s/,(.*( \S+))$/\2\n\1/;P;D' file
从当前行中删除多余的空格。将每个,
替换为空格,后跟当前行的最后一个字段,后跟换行符。打印当前行中的第一行,删除第一行并重复。
答案 5 :(得分:0)
您也可以使用此sed
sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA' infile
您将输出标签分开。
如果您不想要此标签:
sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA;s/\t/ /g' infile